我的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.
}
我使用pushViewController:animated:
显示视图控制器:
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
[self pushViewController:controller animated:isAnimated];
我发现,如果用户在屏幕开始出现时立即按下MENU,同时仍然显示交叉渐变过渡效果,他们可以躲避UITapGestureRecognizer并返回到之前的屏幕,这不是故意的。它们也可以通过一遍又一遍地捣碎菜单来引起问题 - 最终它们将逃脱他们不应该做的事情。
如何确保MENU按下始终达到我的覆盖?有没有办法指定一个包含应用程序的MENU按钮处理程序,仍然使用UINavigationController?
答案 0 :(得分:3)
对我有用的解决方案是在self.navigationController.view
上安装UITapGestureRecognizer。任何被常规UIViewControllers错过的水龙头最终都会被导航控制器的识别器捕获。如果你在你创建的每个视图控制器上安装UITapGestureRecognizers,那么通过裂缝到导航控制器的唯一点击是在转换过程中出现的点击,并且完全忽略这些点击是安全的。
请注意,当您希望MENU返回主屏幕时,您需要暂时移除此点击识别器并让tvOS自行处理水龙头,因为我找不到干净的方式逃离主屏幕。我的代码(缺少exit(0)
)。
答案 1 :(得分:0)
由于这种行为,我有类似的问题。
在我的情况下,我有自定义焦点管理,具体取决于pressesEnded
上检测到的菜单按钮点击并由preferredFocusedView
管理。但是当导航控制器弹出ViewController时,用户再次点击MENU按钮,然后UINavigationController
类检测到pressesEnded
,然后在我的目标ViewController上调用preferredFocusedView
我的管理员在哪里pressesEnded
{ {1}}不会被调用,因为被盗了#34} UINavigationController
。
在我的案例中解决这个问题的方法是创建" dummy" 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?) {
}
}