覆盖苹果Siri遥控器菜单按钮默认行为

5
根据苹果公司的指南,在tvOS上按菜单按钮应该返回到上一个菜单,直到你到达顶部菜单时,它应该返回到操作系统菜单。我的问题是,如何防止菜单按钮的默认行为并阻止其返回到操作系统菜单,但当用户在我的应用程序的顶部菜单时重新激活它?
3个回答

16
你可以注册一个 `tapGestureRecognizer` 并像这样设置代码 `allowedPressTypes = UIPressTypeMenu` :tapGestureRecognizer.allowedPressTypes = [UIPressType.menu.rawValue]
UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapGestureRec.allowedPressTypes = @[@(UIPressTypeMenu)];
[self.view addGestureRecognizer:tapGestureRec];

每当按下Siri遥控器的菜单按钮时,您的handleTap方法将被调用,让您可以添加任何所需的自定义逻辑。但请注意,阻止菜单按钮在根视图控制器上挂起您的应用程序可能会导致应用商店拒绝。

您可以在此处获取有关检测手势的更多信息,并在此处了解有关pressTypes的信息。


将其添加到视图的已识别手势中,这个简单的操作是否会阻止它执行其默认行为? - mredig
1
是的,这就是我在我的代码中使用的内容。每当菜单按钮被按下时,它将调用您提供的选择器,现在由您决定如何处理它... - Adnan Aftab
我在AVPLayerViewController上添加了tapgesture,但是tvos中的菜单按钮手势没有响应。 - Vipulk617

6

以下是我使用的 @C_X 答案的 Swift 版本,对我有效。

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)

我正在开发Apple Tv应用程序。该应用程序基于视频播放。我的要求是,当用户暂停视频并按菜单按钮时,视频应该继续播放。我希望在视频暂停状态下,用户按菜单按钮后屏幕会重定向到上一个屏幕,而不播放视频。 - Sankalap Yaduraj Singh
在您的_handleTap_函数中,您应该能够从堆栈中弹出当前VC。 - Individual11
不错,简洁的解决方案。添加了Swift 3的语法。 - Chris Livdahl

4

使用UINavigationController可以免费获得此行为。

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


到目前为止,我发现的最干净的解决方案。运行得很好! - Micky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接