iOS横竖屏旋转内容总结

2020-01-21 04:41:39刘景俊

@objc private func handleDeviceOrientationChange(notification: Notification) {
 // 获取设备方向
 let orientation = UIDevice.current.orientation
 switch orientation {
  case .landscapeRight:
   // iOS8之后,横屏UIScreen.main.bounds.width等于竖屏时的UIScreen.main.bounds.height
   print(UIScreen.main.bounds.width)
   print("landscapeRight")
  default: break
 }
}

注销


deinit {
 NotificationCenter.default.removeObserver(self)
 UIDevice.current.endGeneratingDeviceOrientationNotifications()
}

2.2.2 观察界面方向并响应

和上面类似不过观察的name为


// 锁定竖屏,无效,通知方法不会触发
NSNotification.Name.UIApplicationWillChangeStatusBarOrientation
NSNotification.Name.UIApplicationDidChangeStatusBarOrientation

获取界面方向


let statusBarOrientation = UIApplication.shared.statusBarOrientation

2.2.3 建议

这里建议监听界面方向,原因有二:

监听设备方向,会返回多个方向,例如portrait和faceUp不冲突。

监听设备方向,上面提到,先是设备旋转,随之界面旋转,这里就有一个问题,我们操作界面时,可能界面还没有旋转。

三、问题解决实战

需要实现部分界面可旋转,部分界面锁定竖屏,首先我们需要配置TARGETS中的Device Orientation,这里是总开关,默认勾选了如图方向:

iOS,横竖屏旋转

如果你确定整个项目只有竖屏,直接只勾选Protrait完事,不过像我现在这样,可能突然一个需求改变就不得不继续适配,哈哈。

这里的配置不要和代码控制的方向相冲突,不然会引发奔溃。

3.1 控制屏幕旋转的函数


// 默认为true
override var shouldAutorotate: Bool {
 return true
}
// 支持的旋转方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
 return .landscapeLeft
}
// 模态切换的默认方向
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
 return .landscapeRight
}

这三个属性都重写的UIViewController的属性。哎,看到模态切换,这里再给自己挖坑一个,以前研究了一会模态切换,只不过没写成总结,后面会写出来(:。

并且这三个方法会受到控制器层级的影响,也就是如果当前控制器配置支持旋转,如果他的导航控制器,乃至Tabbar控制器不支持旋转,当前控制器的配置也不会生效。

3.2 不同根控制器情况下的解决

核心问题: 需要旋转的界面是少数,大多界面需要锁定竖屏。

3.2.1 根控制器为UIViewController

对应Demo配置: