无法拦截 Siri Remote 上的暂停按钮 - 始终停止背景音乐并且从不恢复
unable to intercep Pause button on SiriRemote - always stops the background music and never resumes it
我正在尝试使用 SiriRemote 上的暂停按钮来暂停我的游戏(SpriteKit,一个 ViewController,多个 SKScenes)。
我正在使用与菜单按钮相同的方法:
- 覆盖 pressesBegan 和 pressesEnded 在我的 GameViewController
- 将UIPressType.PlayPauseUIPressType.PlayPause事件传递给当前场景,通过skView.scene!作为! PilotButtonDelegate(这是我处理那些该死的按钮的委托)
- 在我的场景中,我处理事件并 return 返回 GameViewController 建议 pressesBegan 和pressesEnded 是否调用 super.pressesBegan(或 Ended)取决于我是否在我的场景与否。
上面的功能就像菜单的魅力(我很好地浏览场景)但暂停确实以某种方式传播回 TVOS 并暂停我的背景音乐,即使我确实拦截它(即不调用超级)。知道我做错了什么吗?
令人惊讶的是,再次按下 PlayPause 并没有启动音乐。
PS。我已经检查过,当我在任何其他应用程序(例如搜索/计算机、照片)中使用 PlayPause 按钮时,会发生相同的行为(例如音乐暂停但不会恢复)。
为了详细说明我上面的评论,这是它的外观,具体取决于您 want/need 的手势类型。
识别器的优点是您可以将它们添加到任何 SKScene,而不是通过 gameViewController 和 delegates/protocols 管理按钮按下。它更容易并且效果很好。
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)
}
}
}
我正在尝试使用 SiriRemote 上的暂停按钮来暂停我的游戏(SpriteKit,一个 ViewController,多个 SKScenes)。
我正在使用与菜单按钮相同的方法:
- 覆盖 pressesBegan 和 pressesEnded 在我的 GameViewController
- 将UIPressType.PlayPauseUIPressType.PlayPause事件传递给当前场景,通过skView.scene!作为! PilotButtonDelegate(这是我处理那些该死的按钮的委托)
- 在我的场景中,我处理事件并 return 返回 GameViewController 建议 pressesBegan 和pressesEnded 是否调用 super.pressesBegan(或 Ended)取决于我是否在我的场景与否。
上面的功能就像菜单的魅力(我很好地浏览场景)但暂停确实以某种方式传播回 TVOS 并暂停我的背景音乐,即使我确实拦截它(即不调用超级)。知道我做错了什么吗?
令人惊讶的是,再次按下 PlayPause 并没有启动音乐。
PS。我已经检查过,当我在任何其他应用程序(例如搜索/计算机、照片)中使用 PlayPause 按钮时,会发生相同的行为(例如音乐暂停但不会恢复)。
为了详细说明我上面的评论,这是它的外观,具体取决于您 want/need 的手势类型。 识别器的优点是您可以将它们添加到任何 SKScene,而不是通过 gameViewController 和 delegates/protocols 管理按钮按下。它更容易并且效果很好。
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)
}
}
}