8

Mam UIViewController w mojej aplikacji tvOS, która pojawi się tylko na kilka sekund i wymaga całkowicie konfigurowalnego zarządzania przyciskiem MENU. Tworzę go tak:tvOS - catch Przyciski MENU podczas zmiany kontrolera push-view

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Add a tap gesture recognizer to handle MENU presses. 
    UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
    tapGestureRec.allowedPressTypes = @[@(UIPressTypeMenu)]; 
    [self.view addGestureRecognizer:tapGestureRec]; 
} 

- (void)handleTap:(UITapGestureRecognizer *)sender 
{ 
    // Code to process the MENU button is here. 
} 

wyświetlać kontroler widoku za pomocą pushViewController:animated::

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 
[self pushViewController:controller animated:isAnimated]; 

Odkryłam, że jeśli użytkownik naciśnie przycisk MENU, jak tylko zacznie się pojawiać na ekranie, podczas gdy na krzyżu -stopniowy efekt przejścia jest nadal wyświetlany, są one w stanie uniknąć UITapGestureRecognizer i wrócić do poprzedniego ekranu, który nie jest przeznaczony. Mogą również powodować problemy, wielokrotnie miażdżąc MENU - w końcu uciekną z rzeczy, których nie będą mogli.

W jaki sposób mogę zapewnić, że naciśnięcie MENU zawsze dotrze do mojego zastąpienia? Czy istnieje sposób na określenie obsługi przycisku MENU obsługującej aplikacje i nadal używają kontrolera UINavigationController?

Odpowiedz

3

Rozwiązaniem, które działało dla mnie było zainstalowanie UITapGestureRecognizer na self.navigationController.view. Każde dotknięcie, które zostanie pominięte przez zwykłe kontrolery UIViewControllers, zostanie zatrzymane przez kontroler nawigacyjny. Jeśli zainstalujesz UITapGestureRecognizers na każdym utworzonym kontrolerze widoku, jedynymi uderzeniami, które wpadną przez pęknięcia do kontrolera nawigacyjnego, będą stuknięcia, które występują w połowie przejścia, i możesz bezpiecznie zignorować te zawory całkowicie.

Pamiętaj, że jeśli chcesz, aby MENU powróciło do ekranu głównego, musisz tymczasowo usunąć ten czytnik i pozwolić mu na samodzielne dotknięcie kranu, ponieważ nie mogę znaleźć żadnego prostego sposobu na ucieczkę na ekran główny w moim kodzie (brakuje exit(0)).

0

Mam bardzo podobny problem z powodu tego zachowania. W moim przypadku mam niestandardowe zarządzanie ogniskowaniem w zależności od kliknięcia przycisku MENU wykryte na pressesEnded i zarządzane przez preferredFocusedView. Ale kiedy kontroler nawigacyjny pojawi się ViewController i użytkownik w tym czasie kliknij drugi przycisk MENU, następnie UINavigationController wykryj pressesEnded, a następnie zadzwoń pod preferredFocusedView w moim docelowym ViewController, gdzie jest moje zarządzanie, ale pressesEnded nie zostanie wywołany, ponieważ został "skradziony" przez UINavigationController .

Rozwiązanie tego problemu w moim przypadku jest stworzenie klasy „obojętne”, który będzie używany przez UINavigationController tak:

class MenuPhysicalHackNavigationController: UINavigationController { 

    override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 

    } 

    override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 

    } 

    override func pressesCancelled(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 

    } 

    override func pressesChanged(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 

    } 

}