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
 

iOS 屏幕旋转的设置方法的更多相关文章

  1. iOS屏幕旋转 浅析

    一.两种orientation 了解屏幕旋转首先需要区分两种orientation 1.device orientation 设备的物理方向,由类型UIDeviceOrientation表示,当前设备 ...

  2. 【转】IOS屏幕旋转与View的transform属性之间的关系,比较底层

    iTouch,iPhone,iPad设置都是支持旋转的,如果我们的程序能够根据不同的方向做出不同的布局,体验会更好. 如何设置程序支持旋转呢,通常我们会在程序的info.plist中进行设置Suppo ...

  3. IOS屏幕旋转思路和实践

    这段时间同事在做一个直播项目,项目有个需求:一个界面需要手动设置屏幕的方向,设置好之后方向不能变化.完成这个需求花了特别大的精力,归因是网上关于屏幕旋转的知识比较凌乱,解决问题花费不少时间,最后决定把 ...

  4. ios 屏幕旋转的问题

    在ios6之前我们旋转屏幕只需要实现shouldAutorotateToInterfaceOrientation就行了 - (BOOL)shouldAutorotateToInterfaceOrien ...

  5. iOS 屏幕旋转 nav+tabbar+present(网页) 2016

    如题,最近一个app架构为 nav + tabbar ,需求是 在点击tabbar中的一个菜单项时,弹出网页,该网页需要横屏显示,其他页面不变  都保持竖屏. XCode Version 7.2.1 ...

  6. ios 屏幕方向的设置

    ref: http://www.cnblogs.com/niit-soft-518/p/5611298.html 实际的项目需求.root是TabBarController,里面有4个navigati ...

  7. iOS屏幕旋转

    三种方法 需求:全局主要是竖屏 个别界面需要横屏

  8. 监听iOS检测屏幕旋转状态,不需开启屏幕旋转-b

    -(void)rotation_icon:(float)n { UIButton *history_btn= [self.view viewWithTag:<#(NSInteger)#>] ...

  9. 监听iOS检测屏幕旋转状态,不需开启屏幕旋转

    -(void)rotation_icon:(float)n { UIButton *history_btn= [self.view viewWithTag:<#(NSInteger)#>] ...

  10. 【转】IOS设备旋转的内部处理流程以及一些【优化建议】

    加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向: typedef NS_ENUM(NSInteger, UIDeviceOrienta ...

随机推荐

  1. OJ中的语言选项里G++ 与 C++的区别

    概念上: C++是一门计算机编程语言,而G++则是C++的编译器. GCC和G++都是GUN的编译器,cc是Unix系统的C Compiler,而gcc则是GNU Compiler Collectio ...

  2. Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举)

    1519A. Red and Blue Beans 问题简述 给定 \(r\) 个红豆,\(b\) 个蓝豆,差值 \(d\) ,要求我们进行为红蓝豆分组,使得红豆和蓝豆绝对值差值不大于 \(d\) , ...

  3. 阿里云张建锋:核心云产品全面 Serverless 化

    11月3日,2022 杭州 · 云栖大会上,阿里云智能总裁张建锋表示,以云为核心的新型计算体系正在形成,软件研发范式正在发生新的变革,Serverless 是其中最重要的趋势之一,阿里云将坚定推进核心 ...

  4. mybatis-plus-QueryWrapper 如何写or效果的语句 以及如何给or加括号

    先说想要的结果 希望mybatis-plus中QueryWrapper写法生成的sql语句中查询条件是 WHERE (( (LOGIN_ID = ? OR SHI_JI_LOGIN_ID = ?) ) ...

  5. 《3D编程模式》写书-第3次记录

    大家好,这段时间我完成了"积木模式"."管道模式"."多线程模式"."依赖隔离模式"的初稿 目前我已经完成了所有模式(7 ...

  6. vue2.x封装svg组件并使用

    https://blog.csdn.net/ChickenBro_/article/details/134027803

  7. python3使用diagrams生成架构图

    技术背景 对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能.这就像我们学习的时候整理的一些Xmind那种思维逻辑图一样,不仅可以帮我们看到组件之间的联系和层级,还能够展示 ...

  8. ASIC 功能验证SVTB

    System Verilog进行验证是可以不综合的 发现DUT中的功能问题 预备知识:Linux/verilog/gvim System Verilog学习目录 System Verilog Test ...

  9. Metastability 亚稳态问题

    亚稳态问题 各种跨时钟域的问题都会归结于亚稳态的问题,IP设计时钟域不超过两个,对于CDC设计要求不高;对于SoC设计来说,CDC处理十分重要 1.什么是亚稳态? transition time 是可 ...

  10. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.26)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...