这里写一个兼容旧版ios的屏幕方向设置,实测了ios12.3 和 16.0.2是可以用的。做个笔记。
1、定义三个类型的屏幕模式设置。
enum SCREEN_SET {
case set_port
case set_land
case set_auto
}
2、在Appdelegate中定义一个变量来设置屏幕方向。
/// 定义全局appdelegate
let myAppdelegate = UIApplication.shared.delegate as? AppDelegate
/// 设置屏幕支持方向
var screen_set: SCREEN_SET = .set_auto
3、修改Appdelegate文件的支持屏幕方向。
/// 需要在这里设置屏幕支持的方向
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if screen_set == .set_port {
return .portrait
} else if screen_set == .set_land {
return UIInterfaceOrientationMask.landscape
}
return UIInterfaceOrientationMask.all
}
4、写一个屏幕工具类。
public struct ScreenTool {
func switchScreenOrientation(vc: UIViewController, mode: SCREEN_SET) {
myAppdelegate?.screen_set = mode
if #available(iOS 16.0, *) {
/// iOS 16以上需要通过scene来实现屏幕方向设置
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
switch mode {
case .set_port:
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .portrait))
break
case .set_land:
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .landscape))
break
case .set_auto:
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .all))
break
}
vc.setNeedsUpdateOfSupportedInterfaceOrientations()
} else {
switch mode {
case .set_port:
/// 强制设置成竖屏
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
break
case .set_land:
/// 强制设置成横屏
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
break
case .set_auto:
/// 设置自动旋转
UIDevice.current.setValue(UIInterfaceOrientation.unknown.rawValue, forKey: "orientation")
break
}
}
}
}
5、在需要设置的视图控制器中调用即可。建议是在下面的方法中调用,可以实现不同的视图控制器实现不同的屏幕显示方向。并监听视图变化。可以实现到一个Base VC ,要用的时候加入即可。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
ScreenTool().switchScreenOrientation(vc: self, mode: SCREEN_SET.set_auto)
}
/// 监听视图变化。在此处对控件重新约束。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
/// 判断横竖屏
if size.width > size.height {
/// 这是横屏
} else {
/// 这是竖屏
}
}