搜了网上的教程是真的乱,废话不多说,这里从启动到具体的VC,横竖屏切换完美搞定。

如果你的app只需要支持一个方向,那么不需要看以下内容,只需要将项目的General设置中,将Device Orientation勾选需要支持的方向即可

下面以只有LandscapeVC界面需要横屏,其他界面都是竖屏为例进行设置示例

一、启动页LaunchScreen

启动页是系统的默认根据info.plist的设置显示,启动时就加载了,加载时机很早,所以你要决定启动页要不要根据手机横竖屏自动旋转,还是保持固定的方向。

1.1、启动页方向设置

如果启动页需要根据手机横竖屏自动旋转,只需要在项目的General设置中,将Device Orientation勾选需要支持的方向即可。这样在横屏或者竖屏启动时会默认加载指定的方向。所以现在将该选项只勾选Portrait

截屏2022-10-18 10.05.24.png

1.2、Appdelegate设置动态横竖屏

Appdelegate中动态设置支持的旋转方向,这个设置会影响statusBar的方向,所以根据最外层当前显示的VC的设置进行显示,由于可能会有多个window同时存在,所以进行判断下

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
   if let window = window, window.isKeyWindow {
      if let vc = window.rootViewController?.presentedViewController {
             return vc.supportedInterfaceOrientations
      }
      return window.rootViewController?.supportedInterfaceOrientations ?? .portrait
    } else {
      return .portrait
    }
}

二、控制器VC的旋转设置

控制器VC的旋转会根据顶部的VC设置,所以看你是否用了导航控制器navigationControllertabbarController,如果是嵌套使用,除了设置指定的VC控制器,还需要设置navigationControllertabbarController的属性,可以自定义这两个子类。

2.1、tabbarController的子类实现

override var shouldAutorotate: Bool {
        return self.selectedViewController?.shouldAutorotate ?? false
 }

 override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return self.selectedViewController?.supportedInterfaceOrientations ?? .portrait
  }

 override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return self.selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
 }

2.2、navigationController的子类实现

override var shouldAutorotate: Bool {
        return self.topViewController?.shouldAutorotate ?? false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return self.topViewController?.supportedInterfaceOrientations ?? .portrait
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return self.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

2.3、默认竖屏VC的实现

//是否需要自动旋转
override var shouldAutorotate: Bool {
        return false
 }

//支持的旋转方向
 override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
 }

//跳转的优先方向
 override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return .portrait
 }

2.4、需要横屏VC的实现

比如LandscapeVC需要横屏,则在LandscapeVC中重新实现旋转

override var shouldAutorotate: Bool {
        return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscape
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
       return .landscapeLeft
}

三、跳转

跳转记得用present的跳转方式

let vc = LandscapeVC()
vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen
self.present(vc, animated: true) {
                
}

☟☟可点击下方广告支持一下☟☟

最后修改:2022 年 10 月 18 日
请我喝杯可乐,请随意打赏: ☞已打赏列表