如何统一TabBar控制器各导航方向?实现指定页面横竖屏切换效果
解决TabBar控制器横竖屏统一及导航页面横竖屏切换问题
我之前也碰到过类似的iOS横竖屏控制的坑,其实问题出在iOS的横竖屏优先级逻辑上:ViewController的设置 > 导航/标签控制器的设置 > AppDelegate的兜底设置。你只修改AppDelegate的方法没用,是因为系统会先读取当前显示的ViewController的横竖屏配置。下面分步骤解决你的两个问题:
1. 让TabBar控制器的每个导航保持相同的方向
要实现所有TabBar项对应的导航方向统一,核心是让TabBarController和它内部的UINavigationController都跟随当前显示的ViewController的横竖屏设置,而不是硬编码固定方向。具体做法是子类化这两个容器控制器:
第一步:自定义UINavigationController
创建一个自定义导航控制器,让它把横竖屏的控制权交给顶层的ViewController:
class CustomNavController: UINavigationController { // 跟随顶层VC的支持方向 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return topViewController?.supportedInterfaceOrientations ?? .portrait } // 允许自动旋转,由顶层VC决定是否开启 override var shouldAutorotate: Bool { return topViewController?.shouldAutorotate ?? true } }
第二步:自定义TabBarController
同样,让TabBarController跟随当前选中的导航控制器的设置:
class CustomTabBarController: UITabBarController { override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return selectedViewController?.supportedInterfaceOrientations ?? .portrait } override var shouldAutorotate: Bool { return selectedViewController?.shouldAutorotate ?? true } }
2. 让所有导航首页面实现和eletticitàTable相同的横竖屏切换效果
现在只有eletticitàTable对应的页面能正常切换,说明这个页面的横竖屏配置是对的,我们只需要把这个配置统一应用到所有TabBar的首页面即可:
第一步:创建基础首页面ViewController
写一个基类,把横竖屏的配置封装进去,让所有TabBar首页面都继承这个类:
class TabRootBaseVC: UIViewController { // 支持竖屏+横屏(根据你的需求调整,比如只支持左右横屏就写.landscapeLeft.union(.landscapeRight).union(.portrait)) override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .allButUpsideDown } // 允许自动旋转 override var shouldAutorotate: Bool { return true } }
第二步:修改所有TabBar首页面的继承关系
把eletticitàTable所在的ViewController(以及其他TabBar的首页面)都改成继承TabRootBaseVC,比如:
class EletticitaTableVC: TabRootBaseVC { // 你的原有代码... }
第三步:调整AppDelegate的兜底设置
最后,把AppDelegate里的方法改成兜底配置,确保没有全局锁死方向:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { // 这里返回你允许的所有方向,让控制器层级来决定具体显示哪个 return .allButUpsideDown }
关键注意点
- 如果你在某个push后的子页面需要锁定竖屏,只需要在那个页面单独重写
supportedInterfaceOrientations为.portrait,返回首页面后会自动恢复首页面的横竖屏设置 - 确保你的Storyboard或者代码中,所有TabBar的导航控制器都是用我们自定义的
CustomNavController,而不是系统默认的UINavigationController
内容的提问来源于stack exchange,提问作者Marco Cavicchi
相关产品推荐
相关产品推荐

