如何在tvOS遥控器中处理菜单按钮动作

8

我遇到了应用程序的一个奇怪问题。实际上,当我呈现一个视图控制器来播放视频时,用户在视频加载时按下菜单按钮,应用程序进入后台。虽然我已经覆盖了菜单按钮操作。

这是我的代码。

override func viewWillAppear(animated: Bool) {
    let menuPressRecognizer = UITapGestureRecognizer()
    menuPressRecognizer.addTarget(self, action: #selector(VideoPlayerViewController.menuButtonAction(_:)))
    menuPressRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.Menu.hashValue)]
    self.playerController.view.addGestureRecognizer(menuPressRecognizer)
}

func menuButtonAction(ges:UITapGestureRecognizer) {
    self.dismissView()
 }
6个回答

19
这是我的代码,已经在我的设备上运行正常。 Swift 3
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let menuPressRecognizer = UITapGestureRecognizer()
    menuPressRecognizer.addTarget(self, action: #selector(YourViewController.menuButtonAction(recognizer:)))
    menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPressType.menu.rawValue)]
    self.view.addGestureRecognizer(menuPressRecognizer)
}

func menuButtonAction(recognizer:UITapGestureRecognizer) {
    self.dismiss(animated: true, completion: nil)
}

Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let menuPressRecognizer = UITapGestureRecognizer()
    menuPressRecognizer.addTarget(self, action: #selector(YourViewController.menuButtonAction(recognizer:)))
    menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPressType.menu.rawValue)]
    self.view.addGestureRecognizer(menuPressRecognizer)
}

@objc func menuButtonAction(recognizer:UITapGestureRecognizer) {
    self.dismiss(animated: true, completion: nil)
}

Swift 4.2和5

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let menuPressRecognizer = UITapGestureRecognizer()
    menuPressRecognizer.addTarget(self, action: #selector(YourViewController.menuButtonAction(recognizer:)))
    menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPress.PressType.menu.rawValue)]
    self.view.addGestureRecognizer(menuPressRecognizer)
}

@objc func menuButtonAction(recognizer:UITapGestureRecognizer) {
    self.dismiss(animated: true, completion: nil)
}

请记住,如果您还要重写shouldUpdateFocus和preferredFocusEnvironments方法,则UITapGestureRecognizer解决方案比覆盖presses withEvent方法更理想。因为UITapGestureRecognizer不会取消其他焦点事件,而presses overrides会这样做。 - PostCodeism
如何在SwiftUI中获取allowedPressTypes - Abhishek Thapliyal

5
当你指定allowedPressTypes时,应该使用枚举的rawValue而不是hashmenuPressRecognizer = [NSNumber(value: UIPressType.menu.rawValue)]

0

这也可以在IB中完成。TapGestureRecognizer的按钮选项中包括菜单按钮。


0

当您想要添加多个值时,可以简单地执行以下操作:

let pressTypes: [NSNumber] = [UIPressType.select, UIPressType.playPause, UIPressType.rightArrow].map{ NSNumber(value: $0.rawValue)}

0

Swift 5:

private func setupRemoteGesture() {
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleMenuPress))
    tapRecognizer.allowedPressTypes = [NSNumber(value: UIPress.PressType.menu.rawValue)]
    view.addGestureRecognizer(tapRecognizer)
}

@objc private func handleMenuPress() {
    // Menu button pressed
}

0

为了更加精细化,您还可以使用以下方法:

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
- (void)pressesChanged:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
- (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
- (void)pressesCancelled:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);

请确保根据苹果公司以下的建议覆盖所有这些方法,如果您选择使用它们中的任何一个:
一般来说,所有进行自定义按压处理的响应者都应该覆盖这四个方法。
对于每个它正在处理的按压(在pressesBegan:withEvent:中接收到的那些按压),您的响应者将接收到pressesEnded:withEvent或pressesCancelled:withEvent:。
对于提供模拟值的按压(如拇指杆或模拟推按钮),将调用pressesChanged:withEvent:。
*** 您必须处理取消的按压以确保应用程序的正确行为。不这样做很可能会导致应用程序出现错误行为或崩溃。

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