如何处理 tvOS 遥控器中的菜单按钮操作

Posted

技术标签:

【中文标题】如何处理 tvOS 遥控器中的菜单按钮操作【英文标题】:How to handle Menu Button action in tvOS remote 【发布时间】:2016-11-16 14:27:37 【问题描述】:

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

这是我的代码。

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()
 

【问题讨论】:

【参考方案1】:

这是我的代码,为我工作。

斯威夫特 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)

斯威夫特 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 解决方案比使用事件方法覆盖印刷机更理想。因为 UITapGestureRecognizer 不会取消其他焦点事件,就像按下覆盖一样。【参考方案2】:

当你指定allowedPressTypes时,你应该使用枚举的rawValue而不是hash

menuPressRecognizer = [NSNumber(value: UIPressType.menu.rawValue)]

【讨论】:

【参考方案3】:

当你想多次添加多个值时,你可以做的很简单:

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

【讨论】:

【参考方案4】:

这也可以在 IB 中完成。 TapGestureRecognizer 上有一个用于按钮的选项,其中包括菜单按钮。

【讨论】:

【参考方案5】:

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

- (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);

如果您按照以下 Apple 的建议选择使用其中任何一种方法,请确保覆盖所有这些方法:

一般来说,所有进行自定义新闻处理的响应者都应该 覆盖所有这四个方法。

您的响应者将收到 pressesEnded:withEvent 或 pressesCancelled:withEvent: 对于每个

按下它正在处理(它收到的那些按下 pressesBegan:withEvent:)。

pressesChanged:withEvent: 将为提供 模拟值(如拇指杆或模拟按钮)

*** 您必须处理取消的印刷机以确保您的应用程序的正确行为。不这样做很可能导致不正确 行为或崩溃。

【讨论】:

【参考方案6】:

斯威夫特 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

【讨论】:

以上是关于如何处理 tvOS 遥控器中的菜单按钮操作的主要内容,如果未能解决你的问题,请参考以下文章

自定义按钮样式 (SwiftUI) tvOS

tvOS - 通过非 Siri 遥控器进行游戏控制

如何处理 tvOS 和 Android TV 之间的 React Native 应用程序中的缩放问题?

tvOS - 替换 UISlider

UITapGestureRecognizer 没有在 tvOS 上接收输入

tvOS:如何处理 TabBar 和 UICollectionView 之间的焦点更改并防止崩溃