无法拦截 Siri Remote 上的“暂停”按钮 - 始终停止背景音乐并且从不继续播放
Posted
技术标签:
【中文标题】无法拦截 Siri Remote 上的“暂停”按钮 - 始终停止背景音乐并且从不继续播放【英文标题】:unable to intercep Pause button on SiriRemote - always stops the background music and never resumes it 【发布时间】:2015-10-29 20:41:19 【问题描述】:我正在尝试使用 SiriRemote 上的暂停按钮来暂停我的游戏(SpriteKit、一个 ViewController、多个 SKScene)。
我使用与菜单按钮相同的方法:
-
在我的 GameViewController 中覆盖 pressesBegan 和 pressesEnded
将 UIPressType.PlayPauseUIPressType.PlayPause 事件传递到当前场景,通过 skView.scene 访问!作为! PilotButtonDelegate(这是我处理那些该死按钮的代表)
在我的场景中,我处理事件并将 Bool 返回到 GameViewController,建议 pressesBegan 和 pressesEnded 调用 super.pressesBegan(或 Ended)取决于我是否在我的场景中处理了这个问题。
Above 就像 Menu 的魅力(我很好地浏览场景),但 Pause 会以某种方式传播回 TVOS 并暂停我的背景音乐,即使我确实拦截了它(即不调用 super)。任何想法我做错了什么?
令人惊讶的是,再次按下 PlayPause 并没有开始播放音乐。
PS。我已经检查过,当我在任何其他应用程序(例如搜索/计算机、照片)中使用 PlayPause 按钮时,会出现相同的行为(例如音乐暂停但不恢复)。
【问题讨论】:
您是否考虑过添加 UItapGesture 识别器而不是 presses 方法?这就是我所做的,效果很好 将对此进行调查并报告。 你的问题解决了吗。我下面的回答有帮助吗? 是的,谢谢...抱歉没有标记它 没问题,很高兴它对你有用。感谢您的标记。 【参考方案1】:详细说明我上面的评论,这取决于你想要/需要什么样的手势。 识别器的优点是您可以将它们添加到任何 SKScene,而不是通过 gameViewController 和委托/协议管理按钮按下。它更容易并且效果很好。
func loadTVGameControls()
// main (select) button
let tapMain = UITapGestureRecognizer()
tapMain.addTarget(self, action: "pressedTVRemoteSelectButton")
tapMain.allowedPressTypes = [NSNumber (integer: UIPressType.Select.rawValue)]
self.view!.addGestureRecognizer(tapMain)
// play pause
let tapPlayPause = UITapGestureRecognizer()
tapPlayPause.addTarget(self, action: "pressedTVRemotePlayPauseButton")
tapPlayPause.allowedPressTypes = [NSNumber (integer: UIPressType.PlayPause.rawValue)]
self.view!.addGestureRecognizer(tapPlayPause)
// menu
let tapMenu = UITapGestureRecognizer()
tapMenu.addTarget(self, action: "pressedTVRemoteMenuButton")
tapMenu.allowedPressTypes = [NSNumber (integer: UIPressType.Menu.rawValue)]
self.view!.addGestureRecognizer(tapMenu)
// swipe right
let rightSwipe = UISwipeGestureRecognizer(target: self, action: "swipedRightTVRemote")
rightSwipe.direction = UISwipeGestureRecognizerDirection.Right
self.view!.addGestureRecognizer(rightSwipe)
// swipe left ...
// swipe up ...
// swipe down ...
func pressedTVRemoteSelectButton()
// do something
func pressedTVRemotePlayPauseButton()
// do something
func pressedTVRemoteMenuButton()
// do something
func swipedRightTVRemote()
// do something
您可以针对不同的场景使用不同的方法。 在我的游戏中,我刚刚转换为 tvOS,我有 1 个像上面的例子,而在我的 GameScene.swift 中有 2 个这样的例子
1) loadTVPauseControls() // 游戏暂停时的新手势
2) loadTVGameOverControls() // 游戏结束时的新手势
在更改手势之前或过渡到新场景时,只需使用以下方法禁用手势。
// MARK: - Disable All Gestures
func disableAllGestures()
guard let view = view else return
guard view.gestureRecognizers != nil else return
for gesture in view.gestureRecognizers!
if let tapRecognizer = gesture as? UITapGestureRecognizer
view.removeGestureRecognizer(tapRecognizer)
if let swipeRecognizer = gesture as? UISwipeGestureRecognizer
view.removeGestureRecognizer(swipeRecognizer)
【讨论】:
以上是关于无法拦截 Siri Remote 上的“暂停”按钮 - 始终停止背景音乐并且从不继续播放的主要内容,如果未能解决你的问题,请参考以下文章
如何访问 Siri Remote 播放/暂停按钮和覆盖菜单按钮
如何检测是不是从 Apple TV Siri Remote 中单击了 Siri 按钮
如何区分 Siri Remote 按钮按下和游戏手柄按钮按下?