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?