Ios 如何从场景中检测设备旋转

Ios 如何从场景中检测设备旋转,ios,swift3,uiviewcontroller,sprite-kit,skscene,Ios,Swift3,Uiviewcontroller,Sprite Kit,Skscene,我只是在尝试XCode的SpriteKit示例应用程序,我正在将其更改为测试和学习 我想找到一个在游戏场景中检测设备旋转的函数(SKScene子类),也就是说,当设备从纵向旋转到横向时,这个函数应该触发 我找到了一个函数 覆盖函数didRotate(来自InterfaceOrientation:UIInterfaceOrientation) 但此函数仅在GameViewController(UIViewController子类)中起作用。我需要一个类似的函数,存在于SKScene子类中 非常感谢

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

我想找到一个在游戏场景中检测设备旋转的函数(SKScene子类),也就是说,当设备从纵向旋转到横向时,这个函数应该触发

我找到了一个函数

覆盖函数didRotate(来自InterfaceOrientation:UIInterfaceOrientation)

但此函数仅在GameViewController(UIViewController子类)中起作用。我需要一个类似的函数,存在于SKScene子类中

非常感谢

由于iOS 8.0已弃用,因此我们将使用新方法

每次旋转发生时,您需要告诉您的GameViewController通知当前场景

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

protocol CanReceiveTransitionEvents {
    func viewWillTransition(to size: CGSize)
}
2.使我们的场景符合CanReceiveRotationEvents 现在让我们让我们自己的场景符合协议

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

就这样。

你的答案奏效了。起初,我想使用委托和协议模式,但它不起作用,因为我在引用呈现场景的GameViewController实例时遇到了问题。我的代表为零。我不知道我可以像您向我展示的那样使用协议(即不创建委托变量)。这对我来说是新的。你从哪里学来的?我想给你一个复选标记或投票你的答案,但不知何故StackOverflow不允许我这样做。再次感谢你!