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