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

时间:2016-02-01 00:08:10

标签: uiviewcontroller tvos uitapgesturerecognizer 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.
}

我使用pushViewController:animated:显示视图控制器:

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

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

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

2 个答案:

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

    }

}