8

Ho un UIViewController nella mia app TVOS che apparirà solo per pochi secondi e richiede la gestione del pulsante MENU totalmente personalizzabile. Creo in questo modo:tvOS - cattura il pulsante MENU durante la transizione del controller 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. 
} 

ho visualizzare il controller della vista utilizzando pushViewController:animated::

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

Ho scoperto che se l'utente preme MENU non appena lo schermo comincia ad apparire, mentre la croce - l'effetto di transizione di dissolvenza continua a essere visualizzato, sono in grado di schivare UITapGestureRecognizer e tornare a una schermata precedente, che non è destinata. Possono anche causare problemi schiacciando MENU ripetutamente - alla fine evaderanno da cose che non dovrebbero essere in grado di fare.

Come posso garantire che la pressione del MENU raggiunga sempre il mio override? C'è un modo per specificare un gestore di pulsanti MENU che comprende app e utilizzare ancora un UINavigationController?

risposta

3

Una soluzione che ha funzionato per me era installare un UITapGestureRecognizer su self.navigationController.view. Tutti i tocchi che vengono persi dai normali UIViewControllers finiscono per essere catturati dal riconoscitore del controller di navigazione. Se installi UITapGestureRecognizers su ciascun controller di visualizzazione che crei, i soli tocchi che cadranno attraverso le crepe al controller di navigazione sono i tocchi che si verificano a metà transizione, ed è sicuro ignorare completamente quei tocchi.

Si noti che quando si desidera che il MENU torni alla schermata iniziale, sarà necessario rimuovere temporaneamente questo indicatore di tocco e lasciare che tvOS gestisca il rubinetto da solo, poiché non sono riuscito a trovare un modo pulito per uscire dalla schermata principale nel mio codice (corto a exit(0)).

0

Ho un problema molto simile a causa di questo comportamento. Nel mio caso, ho la gestione personalizzata del fuoco in base al clic del pulsante MENU rilevato su pressesEnded e gestito da preferredFocusedView. Ma quando il controller di navigazione viene visualizzato ViewController e l'utente in questo momento fare un secondo clic sul pulsante MENU, quindi UINavigationController class detect pressesEnded e quindi chiamare preferredFocusedView sulla mia destinazione ViewController dove è la mia gestione ma pressesEnded non verrà chiamato, perché è stato "rubato" da UINavigationController .

soluzione per questo problema nel mio caso è quello di creare di classe "fittizio" che verrà utilizzato da UINavigationController come questo:

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?) { 

    } 

} 
Problemi correlati