【iOS】Swift4.0 横竖屏监测、动态切换

前言:做图片选择器的时候,需要支持横竖屏动态切换。笔记记录一下较为简便的处理方法。

前提: APP全局强制竖屏且不支持横屏!在部分页面如果打开横竖屏开关,则支持横竖屏动态切换;如果关闭,则需要点击才能跳转横屏页面。

【iOS】Swift4.0 横竖屏监测、动态切换_第1张图片
全局强制竖屏

一、设备支持横竖屏切换

设备在控制页面打开横竖屏开关,即设备支持横竖屏动态切换。


【iOS】Swift4.0 横竖屏监测、动态切换_第2张图片
支持横竖屏

添加横竖屏的通知

  • 添加横竖屏的通知
  • 在通知方法内处理横屏 or 竖屏需要做的事
  • 移除通知
1.监测手机横屏的通知
NotificationCenter.default.addObserver(self, selector: #selector(handleDeviceOrientationDidChange(interfaceOrientation:)), name: UIDevice.orientationDidChangeNotification, object: nil)

2.手机更改屏幕方向后发送通知, 跳转到页面
@objc func handleDeviceOrientationDidChange(interfaceOrientation: UIInterfaceOrientation){
    let device = UIDevice.current
    //横屏时, 跳转页面
    if device.orientation == .landscapeLeft || device.orientation == .landscapeRight{
        //横屏时候要做的事 do something
    }
    //竖屏时,退出页面
    if device.orientation == .portrait || device.orientation == .portraitUpsideDown{
        //竖屏时候要做的事 do something     
    }
}

3.移除通知
deinit {
    NotificationCenter.default.removeObserver(self)
}

UIDevice横竖屏参数

public enum UIDeviceOrientation : Int {

    case unknown 
    case portrait // 设备垂直方向,home按钮在底部
    case portraitUpsideDown // 设备垂直方向,主页按钮在顶部
    case landscapeLeft //设备水平方向,主按钮在右边
    case landscapeRight //设备水平方向,主按钮在左边
    case faceUp // 面向设备平面,面朝上
    case faceDown // 面向设备平面,面朝下
}

效果

  • 当在竖屏时,横屏会跳转横屏页面
  • 当在横屏时,竖屏会返回竖屏页

下图做了个简单的gif展现,下图的操作是操作手机横竖屏的结果


横竖屏动态切换.gif

二、设备不支持横竖屏切换-强制横屏

下面说一下强制横屏的处理办法
强制横屏就是在设备仅支持竖屏的前提下


【iOS】Swift4.0 横竖屏监测、动态切换_第3张图片
设备仅支持竖屏

AppDelegate中设置

  • 添加全局横竖屏控制开关
  • supportedInterfaceOrientationsFor方法内添加横竖屏支持
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    //横竖屏控制开关
    var allowRotation: Bool = false
    //AppDelegate 的其他方法………………

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    
        if allowRotation{
            //如果横屏开关打卡,允许设备横屏
            return UIInterfaceOrientationMask.landscape
        }
        //APP默认支持竖屏
        return UIInterfaceOrientationMask.portrait
    }
}

ViewController配置

  • viewDidLoad中设置allowRotation变量为true
  • 在页面返回方法中设置allowRotation变量为false,并且需要把屏幕设置回竖屏
1.获取AppDelegate变量
private let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate

2.viewDidLoad 设置全局变量
override func viewDidLoad() {
    appDelegate.allowRotation = true
}

3.在页面返回方法中设置全局变量,并设置回竖屏
//退出横屏
@objc func exitFullScreen(){
    appDelegate.allowRotation = false
    //将视图还原成竖屏
    let orientationTarget = UIInterfaceOrientation.portrait.rawValue
    UIDevice.current.setValue(orientationTarget, forKey: "orientation")
}

效果展示

  • 当在竖屏时,点击全屏按钮跳转强制横屏页面
强制横屏

你可能感兴趣的:(【iOS】Swift4.0 横竖屏监测、动态切换)