Swift iOS16 设置横竖屏方向

这里写一个兼容旧版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 {
            /// 这是竖屏
        }
    }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在SwiftUI中强制横屏,你可以按照以下步骤进行操作: 1. 在需要设置横屏的视图控制器中,调用`supportedInterfaceOrientations`方法并返回`.landscape`。这将指定该视图控制器只支持横屏方向。可以在`viewWillAppear`方法中调用该方法。 2. 在Appdelegate文件中,修改`supportedInterfaceOrientationsFor`方法,将其返回值设置为`.landscape`。这将使整个应用程序只支持横屏方向。 请注意,以上方法仅适用于UIKit应用程序,对于SwiftUI应用程序,可以在`SceneDelegate`中使用`windowScene`的`interfaceOrientation`属性来设置横屏方向。您可以使用以下代码示例: ```swift func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) // 设置横屏方向 window.rootViewController = YourRootViewController() window.windowScene = windowScene window.makeKeyAndVisible() // 设置横屏方向 if let delegate = UIApplication.shared.delegate as? AppDelegate { delegate.screen_set = .set_land } } ``` 以上代码将在应用程序启动时设置横屏方向,并将`YourRootViewController()`作为窗口的根视图控制器。您还需要在`AppDelegate`中定义一个变量`screen_set`来设置方向。 请注意,强制横屏可能影响用户体验,并且可能不符合Apple的设计指南。在使用此功能时,请确保您了解用户体验和应用程序的设计需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Swift iOS16 设置横竖方向](https://blog.csdn.net/qq_27637465/article/details/127452039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值