iOS如何强制指定view controller仅正向竖屏、禁止旋转至倒置状态
iOS部分UIViewController仅支持正向竖屏实现方案
基础实现步骤
- 首先确认项目全局方向配置:打开Xcode项目的
General-Deployment Info-Device Orientation,勾选你需要全局支持的方向即可,哪怕全局勾选了倒置竖屏也不影响后续单个VC的限制逻辑 - 给需要锁定正向竖屏的ViewController重写方向控制属性
Swift 代码示例
// 仅支持正向竖屏(Home键在设备底部) override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait } // 禁止自动旋转 override var shouldAutorotate: Bool { return false }Objective-C 代码示例
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (BOOL)shouldAutorotate { return NO; }
容器VC嵌套场景适配
如果需要锁定方向的VC嵌套在UINavigationController或者UITabBarController中,需要子类化容器VC,优先取当前展示的子VC的方向配置,以UINavigationController为例:
class CustomNavigationController: UINavigationController { override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return topViewController?.supportedInterfaceOrientations ?? .all } override var shouldAutorotate: Bool { return topViewController?.shouldAutorotate ?? true } }
进入VC时强制切到正向竖屏
如果需要进入指定VC时立刻切换到正向竖屏,可在VC的viewWillAppear生命周期中添加如下代码:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if #available(iOS 16.0, *) { self.setNeedsUpdateOfSupportedInterfaceOrientations() UIApplication.shared.connectedScenes .filter { $0.activationState == .foregroundActive } .compactMap { $0 as? UIWindowScene } .first?.requestGeometryUpdate(.iOS(interfaceOrientations: .portrait)) } else { UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") } }
注意:
UIInterfaceOrientationMask.portrait对应的就是物理Home键在底部的正向竖屏,portraitUpsideDown才是倒置竖屏,仅返回前者即可自动禁止倒置竖屏的旋转选项,单个VC的方向配置优先级高于项目全局配置。
内容的提问来源于stack exchange,提问作者Vinh Hung Nguyen
相关产品推荐
相关产品推荐

