8

У меня есть UIViewController в моем приложении tvOS, которое появится только на несколько секунд и требует полностью настраиваемой обработки кнопок MENU. Я создаю его так:tvOS - нажатие кнопки MENU нажимает во время перехода с кнопочного контроллера

- (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. 
} 

отобразить контроллер представления с помощью pushViewController:animated::

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

Я обнаружил, что, если пользователь нажимает кнопку MENU, как только экран начинает появляться, в то время как крест -fade-эффект перехода по-прежнему отображается, они могут уклониться от UITapGestureRecognizer и вернуться к предыдущему экрану, который не предназначен. Они также могут вызывать проблемы, сменяя МЕНЮ снова и снова - в конечном итоге они избегут вещей, которые им не удастся.

Как я могу гарантировать, что нажатие кнопки MENU всегда будет меняться? Есть ли способ указать приложение, содержащее обработчик кнопки MENU, и все еще использовать UINavigationController?

ответ

3

Решение, которое работало для меня, заключалось в установке UITapGestureRecognizer на self.navigationController.view. Любые краны, которые пропущены обычными UIViewControllers, в конечном итоге попадают на распознаватель навигационного контроллера. Если вы устанавливаете UITapGestureRecognizers на каждом создаваемом контроллере представления, единственные краны, которые будут попадать через трещины в контроллер навигации, являются кранами, которые происходят в середине перехода, и можно просто полностью игнорировать эти краны.

Обратите внимание, что если вы хотите, чтобы МЕНЮ возвращалось на главный экран, вам необходимо временно удалить этот распознаватель крана и позволить tvOS самостоятельно управлять краном, так как я не мог найти чистый способ выйти на главный экран в моем коде (за исключением exit(0)).

0

У меня очень похожая проблема из-за этого поведения. В моем случае я настраиваю управление фокусировкой в ​​зависимости от нажатия кнопки MENU, обнаруженного на pressesEnded и управляется preferredFocusedView. Но когда навигационный контроллер набирает ViewController, и пользователь в это время делает второй щелчок на кнопке MENU, то UINavigationController класс обнаруживает pressesEnded, а затем звонит preferredFocusedView в мой пункт назначения ViewController, где находится мое управление, но pressesEnded не будет вызываться, потому что был «украден» UINavigationController ,

Решение этой проблемы в моем случае это создать класс «фиктивный», который будет использоваться UINavigationController так:

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

    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^