覆盖 Apple Siri 远程菜单按钮默认行为

Override Apple Siri remote Menu Button Default behavior

根据 Apple 的 guidelines,按电视上的菜单按钮 OS 应该 return 到上一个菜单,直到您位于顶部菜单,此时它应该return 您转到 OS 菜单。我的问题是,如何防止菜单按钮的默认行为并阻止它从 return 进入 OS 菜单,然后在用户位于我的应用程序的顶部菜单时重新激活它?

您可以像这样注册一个 tapGestureRecognizer 并设置 allowedPressTypes = UIPressTypeMenu 代码:

UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapGestureRec.allowedPressTypes = @[@(UIPressTypeMenu)];
[self.view addGestureRecognizer:tapGestureRec];

然后,只要按下 Siri 遥控器菜单按钮,您的 handleTap 方法就会被调用,允许您添加您需要的任何自定义逻辑。请注意,阻止菜单按钮在根视图控制器上暂停您的应用程序可能会导致 App Store 拒绝。

您可以获得更多关于检测手势的信息here and about pressTypes here

此行为是您使用 UINavigationController 免费获得的。

更一般地说,容器视图控制器可以使用 -gestureRecognizerShouldBegin: 委托方法来允许或阻止菜单按钮点击手势识别器根据它是否在嵌套的根级别开始。当共享 UIApplication 实例收到未处理的菜单按钮按下时,它将通知系统,这将导致应用程序被发送到后台。

Swift @C_X 答案的版本,对我有用。

let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
tapGesture.allowedPressTypes = [NSNumber(integer: UIPressType.Menu.rawValue)]
self.view.addGestureRecognizer(tapGesture)

Swift 3 版本:

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MyClass.handleMenuPress(_:)))
tapGesture.allowedPressTypes = [NSNumber(value: UIPressType.menu.rawValue)]
self.view.addGestureRecognizer(tapGesture)