无法拦截SiriRemote上的暂停按钮 - 始终停止背景音乐并且永远不会恢复它

时间:2015-10-29 20:41:19

标签: tvos apple-tv siri-remote

我正在尝试使用SiriRemote上的Pause按钮暂停我的游戏(SpriteKit,一个ViewController,多个SKScenes)。

我使用与菜单按钮相同的方法:

  1. GameViewController
  2. 中覆盖 pressBegan pressEnded
  3. UIPressType PlayPauseUIPressType PlayPause 事件传递到当前场景,通过 skView.scene进行访问!如! PilotButtonDelegate (这是我处理那些该死的按钮的代表)
  4. 在我的场景中,我处理事件并将Bool返回 GameViewController 建议 pressBegan pressEnded 来调用超级 pressBegan (或已结束)或不依赖我是否在我的场景中处理过此事。
  5. 上面的作品就像菜单的魅力(我很好地浏览场景)但是Pause以某种方式传播回TVOS并暂停我的背景音乐,即使我拦截它(即不要调用超级)。我有什么想法吗?

    令人惊讶的是,按下PlayPause再次无法启动音乐。

    PS。我已经检查过,当我在任何其他应用程序(例如搜索/计算机,照片)中使用PlayPause按钮时,会出现相同的行为(例如音乐暂停但不恢复)。

1 个答案:

答案 0 :(得分: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个像上面的例子,而不是2个更像我的GameScene.swift

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