如何从SKscene检测设备旋转

时间:2018-04-25 00:30:57

标签: ios swift3 uiviewcontroller sprite-kit skscene

我正在尝试使用XCode的SpriteKit示例应用程序,我正在将其更改为测试和学习。

我想在GameScene(SKScene子类)中找到一个检测设备旋转的函数,即当设备从纵向旋转到横向等时,该函数应该触发。

我找到了一个功能

override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation)

但此函数仅适用于GameViewController(UIViewController子类)。我需要SKScene子类中存在的类似函数。

非常感谢。

1 个答案:

答案 0 :(得分:1)

  自iOS 8.0以来,

didRotate(from:)已被弃用,因此我们将使用新方法。

每次轮换发生时,您都需要告诉'GameViewController通知当前场景。

1。 CanReceiveTransitionEvents协议

让我们定义一个协议来说明符合类型(我们的场景)可以接收旋转事件

protocol CanReceiveTransitionEvents {
    func viewWillTransition(to size: CGSize)
}

2。使我们的场景符合CanReceiveRotationEvents

现在让我们将自己的SKScene符合协议

class GameScene: SKScene, CanReceiveTransitionEvents {

    func viewWillTransition(to size: CGSize) {
        // this method will be called when a change in screen size occurs
        // so add here your code
    }
}
  

如果您有多个场景,请重复每个场景。

3。 ViewController应该通知场景每次旋转

最后让控制器在每次检测到旋转时调用相关的场景方法

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

    super.viewWillTransition(to: size, with: coordinator)

    guard
        let skView = self.view as? SKView,
        let canReceiveRotationEvents = skView.scene as? CanReceiveTransitionEvents else { return }

    canReceiveRotationEvents.viewWillTransition(to: size)
}

就是这样。