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

Posted

技术标签:

【中文标题】tvOS - 在推送视图控制器转换期间捕获 MENU 按钮按下【英文标题】:tvOS - catch MENU button presses during push-view-controller transition 【发布时间】:2016-02-01 00:08:09 【问题描述】:

我的 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 按下时始终达到我的覆盖范围?有没有办法指定一个包含应用程序的 MENU 按钮处理程序并仍然使用 UINavigationController?

【问题讨论】:

【参考方案1】:

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

请注意,当您希望 MENU 返回主屏幕时,您需要暂时移除此点击识别器并让 tvOS 自行处理点击,因为我找不到任何干净的方法可以逃到主屏幕我的代码(缺少exit(0))。

【讨论】:

ARG!有没有办法有条件地处理这个? 我想我可以在添加手势识别器之前处理/检查我的条件。【参考方案2】:

由于这种行为,我遇到了非常相似的问题。 就我而言,我有自定义焦点管理,具体取决于在pressesEnded 上检测到的 MENU 按钮单击并由preferredFocusedView 管理。但是当导航控制器弹出 ViewController 时,此时用户第二次单击 MENU 按钮,然后 UINavigationController 类检测 pressesEnded 然后在我的目标 ViewController 上调用 preferredFocusedView 我的管理在哪里,但不会调用 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?) 

    


【讨论】:

以上是关于tvOS - 在推送视图控制器转换期间捕获 MENU 按钮按下的主要内容,如果未能解决你的问题,请参考以下文章

tvOS 上的 UIViewControllerTransitioningDelegate 未被调用

tvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器

如何在 tvOS 的同一视图中显示 UISearchController?

在自定义视图控制器转换中抑制导航推送动画

tvOS 的 UITabBarController 中视图控制器的最大数量是多少

推送视图:在发生现有转换或演示时;导航堆栈不会更新