You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SKScene子类中实现设备旋转检测功能?

嘿,我之前在折腾SpriteKit项目的时候也遇到过这个问题——想在GameScene里直接监听设备旋转,结果发现ViewController里的didRotate根本没法直接用在Scene上!给你两个实用的解决方案:

方案一:用通知中心监听旋转事件

这是最直接的方式,通过系统通知来捕获设备旋转状态变化,在GameScene里就能直接处理:

  1. 添加通知观察者
    在GameScene的didMove(to view: SKView)方法里注册监听:
override func didMove(to view: SKView) {
    super.didMove(to: view)
    // 注册旋转通知
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(handleOrientationChange),
        name: UIApplication.didChangeStatusBarOrientationNotification,
        object: nil
    )
}
  1. 实现旋转处理方法
    写一个对应的方法来处理旋转逻辑,还能兼容iOS 13+的新API:
@objc private func handleOrientationChange() {
    // 获取当前屏幕方向,适配iOS 13及以上版本
    let currentOrientation: UIInterfaceOrientation
    if #available(iOS 13.0, *) {
        currentOrientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .portrait
    } else {
        currentOrientation = UIApplication.shared.statusBarOrientation
    }
    
    // 根据方向执行不同逻辑
    switch currentOrientation {
    case .portrait:
        print("切换到竖屏啦!")
        // 这里可以调整场景布局、节点位置/大小等
    case .landscapeLeft, .landscapeRight:
        print("切换到横屏啦!")
        // 横屏对应的处理逻辑
    default:
        break
    }
}
  1. 移除观察者避免内存泄漏
    记得在Scene销毁时移除通知监听:
deinit {
    NotificationCenter.default.removeObserver(self)
}
方案二:通过ViewController传递旋转事件

如果你已经在GameViewController里实现了didRotate方法,可以直接把旋转事件传递给GameScene:

  1. 在ViewController的didRotate里调用Scene方法
class GameViewController: UIViewController {
    override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
        super.didRotate(from: fromInterfaceOrientation)
        // 获取当前的GameScene实例
        guard let skView = view as? SKView,
              let gameScene = skView.scene as? GameScene else { return }
        
        // 把旋转状态传给Scene
        let currentOrientation = UIApplication.shared.statusBarOrientation
        gameScene.handleDeviceRotation(to: currentOrientation)
    }
}
  1. 在GameScene里实现接收方法
class GameScene: SKScene {
    func handleDeviceRotation(to orientation: UIInterfaceOrientation) {
        // 在这里处理旋转逻辑,和方案一的判断逻辑一样
        switch orientation {
        case .portrait:
            // 竖屏处理
        case .landscapeLeft, .landscapeRight:
            // 横屏处理
        default:
            break
        }
    }
}

两种方法都能满足你的需求,我个人更推荐方案一,不用依赖ViewController的代码,Scene自己就能搞定~

内容的提问来源于stack exchange,提问作者Matthew the Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:02:48