Swift iOS16 设置横竖屏方向

本文档详细介绍了如何在iOS 12.3及更高版本的App中实现屏幕方向设置,包括使用枚举定义三种模式、在AppDelegate中设置方向、创建工具类进行屏幕切换,并提供不同视图控制器间的定向控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写一个兼容旧版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 {
            /// 这是竖屏
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值