根据Apple的guidelines,按下tvOS上的菜单按钮会返回到上一个菜单,直到您进入顶部菜单,此时它应该返回到操作系统菜单。我的问题是,如何阻止菜单按钮的默认行为并阻止其返回OS菜单,但是当用户位于我的应用程序的顶层菜单时重新激活它?
答案 0 :(得分:16)
您可以注册tapGestureRecognizer
并设置allowedPressTypes = UIPressTypeMenu
代码,如下所示:
UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapGestureRec.allowedPressTypes = @[@(UIPressTypeMenu)];
[self.view addGestureRecognizer:tapGestureRec];
然后,只要按下Siri遥控器菜单按钮,就会调用handleTap
方法,允许您添加所需的任何自定义逻辑。请注意,阻止菜单按钮暂停应用程序在根视图控制器上可能会导致App Store拒绝。
答案 1 :(得分: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)
答案 2 :(得分:2)
您可以使用UINavigationController
免费获得此行为。
更一般地说,容器视图控制器可以使用-gestureRecognizerShouldBegin:
委托方法来允许或阻止菜单按钮点击手势识别器根据它是否处于嵌套的根级别而开始。当共享UIApplication
实例收到未处理的菜单按钮时,它将通知系统,这将导致应用程序被发送到后台。