Swift开发中如何为SpriteKit场景选择性禁止屏幕自动旋转
按视图/场景选择性控制自动旋转的实现方案
前置全局配置
- 先在项目
Deployment Info中勾选所有你需要支持的设备方向(竖屏、横屏左、横屏右等),不要在此处做全局方向限制,保证系统层面支持所有目标方向。
第一步:实现控制器粒度的旋转权限控制
iOS的自动旋转权限由当前最顶层的可见控制器决定,你需要先给根容器控制器(导航控制器、TabBar控制器)添加转发逻辑,将旋转判断权限下发给当前显示的子控制器,以UINavigationController为例:
class CustomNavigationController: UINavigationController { override var shouldAutorotate: Bool { topViewController?.shouldAutorotate ?? super.shouldAutorotate } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { topViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations } }
如果使用UITabBarController作为根容器,同理将判断逻辑转发给selectedViewController即可。
普通文本类页面配置
对于需要保留自动旋转能力的普通页面,直接在对应控制器中返回允许旋转的配置即可,和原有系统逻辑完全一致:
// 普通文本类页面控制器 override var shouldAutorotate: Bool { true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .all // 可根据实际需求调整为需要支持的方向集合 }
SpriteKit场景承载页配置
对于承载SpriteKit场景的控制器,直接锁定自动旋转,固定初始方向,保证系统不会自动旋转控制器视图:
// SpriteKit场景承载控制器 override var shouldAutorotate: Bool { false } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait // 固定为你开发场景时使用的初始方向即可,比如竖屏 }
第二步:SpriteKit场景自适配横竖屏(无需修改原有位置计算逻辑)
因为承载控制器已经锁定了旋转,场景内部的坐标系永远保持你开发时的固定逻辑(比如竖屏坐标系下长轴为上下方向,双向车道沿上下排布,车辆位置计算完全基于这个固定坐标系,不需要做任何改动),你只需要监听设备方向变化,对场景本身做旋转适配即可:
- 在场景承载控制器中开启设备方向监听:
UIDevice.current.beginGeneratingDeviceOrientationNotifications() NotificationCenter.default.addObserver(self, selector: #selector(handleOrientationChange), name: UIDevice.orientationDidChangeNotification, object: nil) - 在方向变化回调中,获取当前设备方向,计算场景需要调整的参数:
- 根据设备方向计算场景需要旋转的角度:竖屏为0,横屏左为
-CGFloat.pi/2,横屏右为CGFloat.pi/2 - 交换当前屏幕宽高得到实际显示区域的尺寸,将SKScene的size更新为该尺寸,保证场景长轴始终和屏幕物理长轴匹配
- 调整SKScene的
zRotation为计算出的旋转角度,同时修改场景的position保证旋转后场景和屏幕中心对齐
- 根据设备方向计算场景需要旋转的角度:竖屏为0,横屏左为
- 场景内需要保持可读的文本节点,在方向变化时给对应节点设置反向的旋转角度即可,该逻辑完全独立,不会影响车道、车辆的原有计算逻辑。
注意:优先调整SKScene的
zRotation、position和size属性,不要直接修改SKView的transform,避免影响SKView上叠加的其他UIKit类视图。
方案优势
- 无需修改全局方向配置,普通页面原生自动旋转能力完全保留
- SpriteKit场景内部坐标系永远固定,所有车辆移动、车道排布的计算逻辑不需要做任何适配
- 所有横竖屏适配逻辑仅作用于场景层,文本旋转、UI控件适配逻辑完全解耦,可独立开发维护
内容的提问来源于stack exchange,提问作者wjd
相关产品推荐
相关产品推荐

