详细说明我上面的评论,这取决于你想要/需要什么样的手势。识别器的优点是您可以将它们添加到任何 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)
}
}
}