根据苹果公司的指南,在tvOS上按菜单按钮应该返回到上一个菜单,直到你到达顶部菜单时,它应该返回到操作系统菜单。我的问题是,如何防止菜单按钮的默认行为并阻止其返回到操作系统菜单,但当用户在我的应用程序的顶部菜单时重新激活它?
tapGestureRecognizer.allowedPressTypes = [UIPressType.menu.rawValue]
UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapGestureRec.allowedPressTypes = @[@(UIPressTypeMenu)];
[self.view addGestureRecognizer:tapGestureRec];
每当按下Siri遥控器的菜单按钮时,您的handleTap
方法将被调用,让您可以添加任何所需的自定义逻辑。但请注意,阻止菜单按钮在根视图控制器上挂起您的应用程序可能会导致应用商店拒绝。
以下是我使用的 @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)
使用UINavigationController
可以免费获得此行为。
更普遍地,容器视图控制器可以使用-gestureRecognizerShouldBegin:
委托方法,根据是否处于嵌套的根级别来允许或阻止菜单按钮点击手势识别器的开始。当共享的UIApplication
实例接收到未处理的菜单按钮按下事件时,它将通知系统,这将导致应用程序被发送到后台。