tvOS - 在推 - 视 - 控制器转换期间按下MENU按钮

Sti*_*sis 8 uiviewcontroller uitapgesturerecognizer tvos siri-remote

我的tvOS应用程序中有一个UIViewController,它只会显示几秒钟,并且需要完全可自定义的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.
}
Run Code Online (Sandbox Code Playgroud)

我用以下方式显示视图控制器pushViewController:animated::

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
[self pushViewController:controller animated:isAnimated];
Run Code Online (Sandbox Code Playgroud)

我发现,如果用户在屏幕开始出现时立即按下MENU,同时仍然显示交叉渐变过渡效果,他们可以躲避UITapGestureRecognizer并返回到之前的屏幕,这不是预期的.它们也可以通过一遍又一遍地捣碎菜单来引起问题 - 最终它们将逃脱他们不应该做的事情.

如何确保MENU按下始终达到我的覆盖?有没有办法指定一个包含应用程序的MENU按钮处理程序,仍然使用UINavigationController?

Sti*_*sis 3

对我有用的解决方案是将 UITapGestureRecognizer 安装到self.navigationController.view. 常规 UIViewController 错过的任何点击最终都会被导航控制器的识别器捕获。如果您在创建的每个视图控制器上安装 UITapGestureRecognizers,则唯一会通过裂缝到达导航控制器的点击是在过渡过程中发生的点击,并且完全忽略这些点击是安全的。

请注意,当您希望 MENU 返回主屏幕时,您需要暂时删除此点击识别器并让 tvOS 自行处理点击,因为我在代码中找不到干净的方法来转至主屏幕(缺乏exit(0))。