首页 > 其他分享 >iOS 屏幕旋转的设置方法

iOS 屏幕旋转的设置方法

时间:2023-04-21 21:44:52浏览次数:38  
标签:return ViewController iOS 旋转 设置 var 屏幕

VC上屏幕旋转的方式有2种 1.因重力导致的屏幕旋转 条件:shouldAutorotate返回true,设备开启了屏幕旋转开关。 设备发生重力旋转。
2.单页面强制旋转 条件:无。 设置设备旋转方向。

NSNumber *orientationTarget = [NSNumber numberWithInteger:isLaunchScreen ? UIInterfaceOrientationLandscapeRight : UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
其中重力旋转要满足的条件至少2个,AppDelegate代理设置和ViewController页面设置 而页面强制旋转只有满足AppDelegate代理设置就可以了。
旋转开关权限优先级 旋转开关权限优先级,决定了屏幕是否可以选择 a.AppDelegate代理 > App-General设备设置/info.plist 支持屏幕旋转, (App-General设备设置和info.plist是同步联动的,它们是APP启动前的预设,AppDelegate代理是App启动后的动态更改,可以覆盖前面启动前的设置) b.ViewControll下的容器控制器也支持旋转,UINavigationController容器, UITabBarController容器设置的shouldAutorotate返回true c.当前ViewController设置的shouldAutorotate返回true。
简单重力屏幕旋转设置 1.AppDelegate代理设置
// ,AppDelegate代理是App启动后的动态更改,可以覆盖启动前的设置,所以它的优先级最大
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if isLaunchScreen {
        return .landscapeRight
    } else {
        return .portrait
    }
}
2.ViewController页面设置 控制单个ViewController的旋转使用下面三个方法
// 1.是否支持屏幕旋转,只有返回true, 下面的两个方法才会执行
open var shouldAutorotate: Bool { get }

// 2.页面支持的屏幕方向
@available(iOS 6.0, *)
open var supportedInterfaceOrientations: UIInterfaceOrientationMask { get }

// 3.页面进入时的屏幕方向
@available(iOS 6.0, *)
open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { get }
复杂重力屏幕旋转设置 复杂重力屏幕旋转需要满足如下条件: 容器控制器的屏幕旋转范围要大于等于孩子控制器的屏幕旋转范围,否则配置传递中断,无法做重力旋转。   以普通的APP页面结构为例 通常的APP页面ViewController组织结构为: UIApplication window 它的根控制器rootViewController为UITabBarController
UITabBarController 下有多个子控制器,它们用UINavigationController包裹着
UINavigationController->UIViewController
UINavigationController->UIViewController
UINavigationController->UIViewController
UINavigationController->UIViewController
根控制器设置 UITabBarController容器控制器
verride var shouldAutorotate: Bool {
    return ((self.selectedViewController?.shouldAutorotate) != nil)
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return self.selectedViewController?.supportedInterfaceOrientations
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return self.selectedViewController?.preferredInterfaceOrientationForPresentation
}
UINavigationController容器控制器
override var shouldAutorotate: Bool {
    return self.topViewController?.shouldAutorotate

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return self.topViewController.supportedInterfaceOrientations
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return self.topViewController.preferredInterfaceOrientationForPresentation
}
单ViewController设置
// ViewController
override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscape
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return .landscapeLeft
}  
屏幕旋转的常见使用场景 Modal出场方式因为没有了容器视图,可以剩去了中间2个容器的传递。
对于APP中主要页面竖屏,部分页面横屏的解决方法。 1.简单强制旋转 a.在AppDelegate和单ViewController设置好选择属性后,强制旋转 b.进入页面时强制横屏,退出时强制竖屏   2.复杂重力旋转 a.全局权限设置支持旋转的方向 b.自定义Tab控制器和Navigation控制器,处理子ViewController与容器ViewController的旋转配置传递 c.自定义ViewControl基类,添加基础旋转配置, d.子类ViewControl中做自定义旋转配置。
旋转适配 ViewController的旋转适配
/* 
    This method is called when the view controller's view's size is changed by its parent (i.e. for the root view controller when its window rotates or is resized). 
    
    If you override this method, you should either call super to propagate the change to children or manually forward the change to children.
    */
@available(iOS 8.0, *)
func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

View的旋转适配
open func layoutSubviews() {
    if UIApplication.shared.statusBarOrientation == UIInterfaceOrientation.landscapeLeft {
        旋转判断
    }
}
名称解释 1. UIDeviceOrientation 手机硬件的方向 2. UlInterfaceOrientation 手机页面的方向 3. UlInterfaceOrientationMask 手机页面支持的方向集合 4.UIDevice.current.orientation 获取手机硬件方向属性     参考文章: https://www.jianshu.com/p/a354ca1890de https://www.likecs.com/show-307967522.html  

标签:return,ViewController,iOS,旋转,设置,var,屏幕
From: https://www.cnblogs.com/zhou--fei/p/17307560.html

相关文章

  • Axios
    Axios介绍:基于promise网络请求,实现异步获取请求数据。(无需重新加载页面完成局部数据刷新)示例一:<!--引入Axios--><scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>​axios.get('/user',{  params:{//传参-> '/user?id=123'  ......
  • 《简化iOS APP上架流程,App Uploader助你搞定!》
    转载;http://kxdang.com/topic/appuploader/questions.htmlAppuploader常见错误及解决方法  问题解决秘籍遇到问题,第一个请登录苹果开发者官网检查一遍账号是否有权限,是否被停用,是否过期,是否有协议需要同意,并且在右上角切换账号后检查所有关联的账号是否工作正常,apple......
  • 《简化iOS APP上架流程,App Uploader助你搞定!》
    转载;http://kxdang.com/topic/appuploader/questions.htmlAppuploader常见错误及解决方法  问题解决秘籍遇到问题,第一个请登录苹果开发者官网检查一遍账号是否有权限,是否被停用,是否过期,是否有协议需要同意,并且在右上角切换账号后检查所有关联的账号是否工作正常,apple......
  • iOS:常用的谓词
    funccompare(_predicateString:String,num:Any)->Bool{letpredicate=NSPredicate(format:predicateString)returnpredicate.evaluate(with:num)}///比较运算///`>`:判定大于///`<`:判定小于///`=`:判定等于///`!=`或`<>`:判定不等于//......
  • iOS:发送消息机制
    消息发送阶段:调用objc_msgSend函数,进行一些内部逻辑处理。会涉及到cache_list和method_list等。动态方法解析:允许开发者动态创建方法。消息转发:进入消息转发阶段......
  • iOS:Copy 关键字
    Copy经常使用的地方是在对属性进行描述的时候。经常使用Copy的类型,NSString,NSArray,NSDictionary,Block等NSString、NSArray,NSDictionary使用copy的原因NSString→NSMutableStringNSArray→NSMutableArrayNSDictionary→NSMutableDictionaryNSString,NSArray,NS......
  • iOS:多线程
    三个都是多线程相关的。GCD简单介绍iOS和osx的核心内核是XNU内核,GCD是基于XNU内核实现的GCD的API全部的libdispatch中GCD的底层实现主要是DispatchQueue和DispatchSourceGCD和NSOperation的区别GCD是纯C语言的API,NSOperation是基于GCD的封......
  • iOS:为什么OC 是动态语言?
    动态类型动态绑定动态加载动态类型:即运行时再决定对象的类型。编译阶段,任何对象都可以指定为id类型,等到运行时,才知道具体的类型。动态绑定:基于动态类型,即某个对象在确定后,其属性和响应消息也被完全确定。动态加载:1.动态加载资源,2可以动态添加类,方法等......
  • iOS:线程锁
    1.什么是线程锁线程锁主要是用来控制多个线程同时访问和修改,避免造成不可预期的问题。2.自旋锁和互斥锁自旋锁:一种用来保护多线程共享资源的锁,与互斥锁不同的是,当自旋锁尝试获取锁是否可用时,以忙等待进行循环检查锁是否可用。当上一个线程没有执行完毕时,下一个线程一直处于......
  • iOS:常用的正则表达式
    转载自Swift正则表达式-简书(jianshu.com)数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?......