Skip to content

适用于 iOS 16 及以下版本的屏幕方向控制方式

MoLice edited this page Dec 7, 2022 · 1 revision

在 iOS 16 以前,如何优雅地控制 App 屏幕方向始终是每个开发者头疼的事情,要么无法按预期旋转为指定方向,要么在不同方向的界面之间切换时动画错乱。而在 iOS 16 里,苹果显然已经认识到该问题,并对其进行了优化,因此在 iOS 16 上,App 的屏幕方向控制通常是符合预期的,但对于依然需要兼容 iOS 15 及以前版本的 App,QMUI 提供了兼容接口,下面将展示一般情况下的使用方式。

通常 App 对屏幕方向的控制只有三种场景。

一、不同界面支持不同的方向

  1. 开启配置表的 AutomaticallyRotateDeviceOrientation 开关。

  2. -[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 上没有所谓的强制旋转到某个方向的概念,放下执念。