如何处理 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 遥控器中的菜单按钮操作的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 tvOS 和 Android TV 之间的 React Native 应用程序中的缩放问题?