-
Notifications
You must be signed in to change notification settings - Fork 1.4k
适用于 iOS 16 及以下版本的屏幕方向控制方式
MoLice edited this page Dec 7, 2022
·
1 revision
在 iOS 16 以前,如何优雅地控制 App 屏幕方向始终是每个开发者头疼的事情,要么无法按预期旋转为指定方向,要么在不同方向的界面之间切换时动画错乱。而在 iOS 16 里,苹果显然已经认识到该问题,并对其进行了优化,因此在 iOS 16 上,App 的屏幕方向控制通常是符合预期的,但对于依然需要兼容 iOS 15 及以前版本的 App,QMUI 提供了兼容接口,下面将展示一般情况下的使用方式。
通常 App 对屏幕方向的控制只有三种场景。
-
开启配置表的
AutomaticallyRotateDeviceOrientation
开关。 -
在
-[UIViewController supportedInterfaceOrientations]
里返回当前界面希望支持的方向。// vc1 支持竖屏 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } // vc2 支持横屏 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscapeLeft; }
然后正常地进行你的 push/present,iOS 16 里系统都会自动处理,iOS 15 QMUI 会帮你处理。
// 注意传进去的方向必须包含在当前界面的 supportedInterfaceOrientations 返回值返回内
[self qmui_rotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft];
旋转为横屏后,此时如果你手动将设备旋转回竖屏,界面也会跟着回到竖屏。
self.shouldLockInLandscape = YES;// 在某个时机修改 supportedInterfaceOrientations 的返回值为你想锁定的方向
[self qmui_setNeedsUpdateOfSupportedInterfaceOrientations];// 告诉系统你想刷新屏幕方向,它就会从 supportedInterfaceOrientations 询问新的值并旋转
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if (self.shouldLockInLandscape) {
return UIInterfaceOrientationLandscapeLeft;
}
return UIInterfaceOrientationMaskAll;
}
如果你的 vc 是继承自 QMUICommonViewController
的,你也可以:
self.supportedOrientationMask = UIInterfaceOrientationLandscapeLeft;// 用属性,就不用重写 supportedInterfaceOrientations 方法,更简洁
[self qmui_setNeedsUpdateOfSupportedInterfaceOrientations];
最后,iPad 上没有所谓的强制旋转到某个方向的概念,放下执念。