iOS屏幕旋转

这篇具有很好参考价值的文章主要介绍了iOS屏幕旋转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.屏幕旋转相关枚举

关于屏幕旋转枚举一共有3种:

UIInterfaceOrientation,    UIInterfaceOrientationMask,   UIDeviceOrientation

1.1 UIInterfaceOrientation 和 UIDeviceOrientation

UIDeviceOrientation是设备当前所处的方向, 它有7个值

UIInterfaceOrientation 是屏幕当前所处的方向,它有5个值

UIInterfaceOrientation和UIDeviceOrientation相比,有两点需要注意:

1.UIInterfaceOrientaion与UIDeviceOrientation是相互对应的,但UIInterfaceOrientaion比UIDeviceOrientation多了两个枚举:

UIDeviceOrientationFaceUp(屏幕朝上平躺)

UIDeviceOrientationFaceDown(屏幕朝下平躺)

2.在处于竖屏和上下翻转的状态时,两个枚举值方向是相同的,但当处于横屏时,两个枚举值正好相反:

UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,

UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft

1.2 UIInterfaceOrientationMask

苹果提供了一个更加方便的位移枚举。在做横竖屏适配时,使用的较多的是这个枚举

2.屏幕旋转权限开启方式

开启屏幕旋转权限的方式有两种:

1.在TARGETS→General中进行勾选:

勾选后,在info.plist文件中会自动生成对应支持的屏幕方向配置项。

注意:由于在这里配置会对项目启动时的lanuch界面产生影响,一般我们不会对lanuch进行横竖屏适配,所以不建议使用该种方式进行配置。

2.在AppDelegate中进行设置

在Deplyment Info中,只勾选Portrait.然后在AppDelegate如下方法中配置支持的屏幕方向:

3.屏幕旋转相关属性及方法

3.1 UIViewController

@property(nonatomic, readonly) BOOL shouldAutorotate NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;

-- 页面是否支持自动旋转

@property(nonatomic, readonly) UIInterfaceOrientationMask supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;

-- 页面支持的选择方向

@property(nonatomic, readonly) UIInterfaceOrientation preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;

-- 页面初始时默认展示的屏幕方向

注意:这三个属性都是只读的,在swift中若要重写其值,需引入一个自定义属性,然后重写其get, set方法:

3.2 获取设备方向(只读)

[UIDevice currentDevice].orientation

setOrientation是私有属性,若想手动改变屏幕方向,不能直接调用setOrientation方法,可以使用NSInvocation对象给[UIDevice currentDevice]发setOrientation消息,强制改变屏幕方向。

3.3 设备旋转监听

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDeviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];

在通知回调中,通过

UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;

获取当前设备方向。注意:必须在调用beginGeneratingDeviceOrientationNotifications方法后,此orientation属性才有效,否则一直是0

所以一般设备旋转监听后加上:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

4.实现方案

4.1 逐级实现

一般项目中会涉及三种控制器:UITabBarController , UINavigationController ,UIViewController。

项目一般使用UITabBarController作为UIWindow的根视图控制器,UITabBarController管理着若干个导航控制器UINavigationController,导航控制器管理着其下面的UIViewController。屏幕旋转控制的优先级为:

UITabBarController → UINavigationController → UIViewController。如果高优先级的控制器关闭了屏幕自动旋转或者只支持竖屏显示,低优先级控制器则无法自动旋转或横屏显示。

若想当前UIViewController进行屏幕旋转控制,则需要重写UITabBarController和UINavigationController中的屏幕旋转的是三个方法,让其响应当前UIViewController的控制。

UITabBarController

UINavigationController

之后就可以在当前ViewController中,重写这三个属性的get方法,来控制页面页面是否支持屏幕旋转,支持的方向以及初始显示方向。

另外,若从一个竖屏页面跳转横屏页面,会发现页面并没有横屏显示。这时需要我们手动设置设备方向,既使用NSInvocation对象给[UIDevice currentDevice]发setOrientation消息,强制改变屏幕方向。

4.2 使用模态视图

1.在AppDelegate中新增一个属性,用来控制当前支持的屏幕方向:

在竖屏页面不需要设置isForceLandscape的值,当通过presenter跳转横屏页面时,在viewDidLoad中,设置其值为YES。当要返回上一页面时,再重新设置其值为NO。

4.3 将View旋转90度

这种方式思路比较简单,

1.当需要横屏时,首先把需要横屏的view从superView中移除,添加到keyWindow上,然后做一个旋转90度的动画。

2.当需要从横屏切换至竖屏时,先做一个反向旋转90度的动画,然后把该view从keyWindow上移除,添加到之前的superView上。

注意:每次切换晚之后,需要把状态文章来源地址https://www.toymoban.com/news/detail-551514.html

到了这里,关于iOS屏幕旋转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS iPadOS safari 独立Web应用屏幕旋转的时候 onresize window.innerHeight 数值不对。

    我有一个日记应用,是可以作为独立 Web 应用运行的那种,但在旋转屏幕的时候获取到的 window.innerHeight 和 window.innerWidth 就不对了,不是屏幕的正常尺寸。导致内容显示不正常。iPhone和 iPad 上都是这样的。 本来应该是这样的。 在旋转一次再转回来的时候就成了这样 我在程序

    2024年02月12日
    浏览(48)
  • 【Effective Objective - C】—— 熟悉Objective-C

    Objective-C通过一套全新语法,在C语言基础上添加了面向对象特性。Objective-C的语法中频繁使用方括号,而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长。其实这样写出来的代码十分易读,只是C++或Java程序员不太能适应。 Objective-C语言学起来很快,但有很

    2024年01月16日
    浏览(47)
  • objective-c 基础学习

    目录 第一节:OC 介绍 ​​第二节:Fundation 框架 ​第三节:NSLog 相对于print 的增强 ​第四节:NSString ​第五节:oc新增数据类型 第六节: 类和对象 ​类的方法的声明与实现 ​第七节:类和对象的存储 第八节:nil 与 NULL 第九节:分组导航标记#pragma mark ​第十节:方法与函

    2024年02月07日
    浏览(42)
  • 第一章 熟悉Objective-C

    Objective—C语言是由Smalltalk演化而来,后者是消息型语言的鼻祖,所以该语言使用的“消息结构”而非“函数调用”。 1. 消息和函数调用之间的区别 关键区别在于: 使用消息结构的语言,其运行所应执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器决定。

    2024年01月18日
    浏览(40)
  • 【KVC补充 Objective-C语言】

    2024年02月15日
    浏览(42)
  • Effective Objective-C 学习(四)

    在执行后台任务时,GCD 并不一定是最佳方式。还有一种技术叫做 NSOperationQueue,它虽然与 GCD 不同,但是却与之相关,开发者可以把操作以 NSOperation 子类的形式放在队列中,而这些操作也能够并发执行。 GCD是纯C的API,而NSOperationQueue是Objective-C的对象。这意味着使用GCD时,任

    2024年02月19日
    浏览(40)
  • Effective Objective-C 学习(二)

    “属性”(property)是 Objective-C 的一项特性,用于封装对象中的数据。Objective-C 对象通常会把其所需的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问。其中,“获取方法”(getter)用于读取变量值,而“设置方法”(setter)用于写入变量值。开发者可以令

    2024年02月20日
    浏览(48)
  • Objective-C日期NSDate使用

    2024年01月21日
    浏览(50)
  • Effective Objective-C 学习(三)

    Objective-C 使用引用计数来管理内存:每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活,那就递增其引用计数:用完了之后,就递减其计数。计数变为 0时,就可以把它销毁。 在ARC中,所有与引用计数有关的方法都无法编译(由于 ARC 会在编译时自动插入

    2024年02月22日
    浏览(49)
  • use gnustep objective-c

    专注于概念,而不是迷失在语言技术细节中 编程语言的目的是成为一个更好的程序员; 也就是说,在设计和实现新系统以及维护旧系统方面变得更加有效 header preprocess interface implementation method variable declare and expression comment basic integer set and float set enum type void type derive type incl

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包