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

iOS如何通过代码程序控制关闭设备自动旋转?

解决iOS代码控制设备自动旋转无效的问题

你的代码没生效,核心原因是AppDelegate层面的旋转控制优先级低于ViewController,且iOS 9+之后系统更依赖ViewController的旋转配置。另外你的方法签名在Swift新版本中存在语法问题,下面给你靠谱的解决步骤:

一、修正AppDelegate全局控制方法

如果要全局统一控制旋转,先把方法改成Swift当前版本的正确签名,直接返回枚举值即可:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return shouldRotate ? .portrait : .landscapeLeft
}

注意:如果页面使用了UINavigationController、UITabBarController这类容器控制器,它们会覆盖AppDelegate的设置,必须自定义容器类转发旋转权限。

二、更可靠的ViewController层面控制(推荐)

直接在需要锁定旋转的ViewController里重写旋转相关属性,优先级最高:

// 禁止自动旋转
override var shouldAutorotate: Bool {
    return false
}

// 指定允许的屏幕方向(示例为固定竖屏)
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

容器控制器适配(导航/标签栏)

若页面被UINavigationController包裹,自定义导航控制器子类,把旋转权限交给当前显示的VC:

class CustomNavController: UINavigationController {
    override var shouldAutorotate: Bool {
        return topViewController?.shouldAutorotate ?? super.shouldAutorotate
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return topViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
    }
}

UITabBarController同理,自定义子类后重写上述两个属性,将权限转发给selectedViewController。

额外注意事项

  • 检查Info.plist的Supported interface orientations,确保你需要的方向已被勾选
  • 优先用真实设备测试,模拟器的旋转行为偶尔会和真机不一致
  • 确认设备的物理旋转开关未被锁定(iPad需特别注意)

内容的提问来源于stack exchange,提问作者Dipon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:04:53