无法拦截 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 中覆盖 pressesBeganpressesEndedUIPressType.PlayPauseUIPressType.PlayPause 事件传递到当前场景,通过 skView.scene 访问!作为! PilotButtonDelegate(这是我处理那些该死按钮的代表) 在我的场景中,我处理事件并将 Bool 返回到 GameViewController,建议 pressesBeganpressesEnded 调用 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 远程菜单按钮

如何区分 Siri Remote 按钮按下和游戏手柄按钮按下?

当 UIButton 获得焦点时,Siri Remote 的菜单按钮不退出应用程序

使用 siri remote tvOS 检测运动手势