iOS 屏幕旋转的设置方法

设置,iOS,方法,屏幕 · 浏览次数 : 120

小编点评

## Screen Rotation in iOS App **There are two ways to handle screen rotation in an iOS app:** **1. Due to gravity:** * `shouldAutorotate` is set to `true` for `UIDeviceOrientation.portrait` and `landscape` orientations. * The device will rotate along with the screen. * The app will automatically adjust its rotation direction if it is rotated. **2. Forced rotation:** * No `shouldAutorotate` is set, and the app uses the `supportedInterfaceOrientations` and `preferredInterfaceOrientationForPresentation` properties to determine the rotation direction. * This method allows the app to force a specific rotation, regardless of the device orientation. **Setting screen rotation direction:** * You can set the desired direction in the following ways: * App delegate: Set `shouldAutorotate` to `true` in the app delegate and override `supportedInterfaceOrientations` and `preferredInterfaceOrientationForPresentation` to specify the desired landscape or portrait orientation. * ViewController: Set `shouldAutorotate` to `true` in the view controller's delegate and override `supportedInterfaceOrientations` and `preferredInterfaceOrientationForPresentation` to specify the desired landscape or portrait orientation. * UINavigationController and TabBarController: Set `shouldAutorotate` to `true` in the respective controllers and override `supportedInterfaceOrientations` and `preferredInterfaceOrientationForPresentation` to specify the desired landscape or portrait orientation for each child view controller. **Complex rotation setup:** * Use a combination of `shouldAutorotate`, `supportedInterfaceOrientations`, and `preferredInterfaceOrientationForPresentation` to handle various scenarios. * For example, you can force landscape orientation for specific child view controllers while allowing portrait orientation for other views. **Here's an example of setting screen rotation in different scenarios:** **Simple rotation for all views:** ```swift override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .all } ``` **Force landscape orientation for all views:** ```swift override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .landscape } ``` **Force portrait orientation for all views:** ```swift override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return .portrait } ``` **Using custom View Controller:** ```swift class CustomViewController: UIViewController { override var shouldAutorotate: Bool { return true } } ``` **Remember to follow Apple's documentation and handle rotation events properly to ensure a smooth and consistent user experience.**

正文

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 屏幕旋转的设置方法相似的内容:

iOS 屏幕旋转的设置方法

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

iOS 单元测试之常用框架 OCMock 详解

测试驱动开发并不是一个很新鲜的概念了。在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候,往往是用模拟器一次一次的从头开始启动 app,然后定位到自己所在模块的程序,做一系列的点击操作,然后查看结果是否符合自己预期。

iOS中的3种定时器

在iOS中有3种常见的定时器,它们可以根据不同的场景进行选择使用。 1.DispatchSourceTimer: 基于GCD实现。 2.CADisplayLink:基于屏幕刷新实现。 3.Timer:基于RunLoop实现。 DispatchSourceTimer定时器 DispatchSource

iOS视图控件的内容显示和离屏渲染流程

iOS中UI控件内容显示流程 UIKit界面组成 iOS中组成页面的各个元素基本来自UIKit,我们可以修改布局或自定义绘制来修改UIKit元素的默认展示。 UIView的页面显示内容有CALayer负责,事件的接收与响应由UIView自己负责。 为什么需要有这样的分工呢,原因是因为Mac上和iPh

iOS开发基础136-防暴力点击

要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤: 第一步:引入Aspects库 首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,

iOS开发基础133-崩溃预防

现代移动应用的用户体验依赖于其稳定性和可靠性。然而,在开发过程中,我们时常会遇到各种崩溃问题。崩溃不仅会影响用户的使用体验,还可能损害应用的声誉。因此,本文将详细介绍一个名为CrashPrevention的工具类,它能够为iOS开发者提供多方面的崩溃预防措施,借助该工具类,开发者能够有效减少崩溃的发

iOS开发基础109-网络安全

在iOS开发中,保障应用的网络安全是一个非常重要的环节。以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中间人攻击。 示例代码: 在Info.plist中配置App Transport Security (

iOS开发基础102-后台保活方案

iOS系统在后台执行程序时,有严格的限制,为了更好地管理资源和电池寿命,iOS会限制应用程序在后台的运行时间。然而,iOS提供了一些特定的策略和技术,使得应用程序可以在特定场景下保持后台运行(即“后台保活”)。以下是iOS中几种常见的后台保活方案,并附上示例代码: 一、后台任务 利用beginBac

iOS开发之弹窗管理

前言 “千淘万漉虽辛苦,吹尽狂沙始到金。”在这快速变化的互联网行业,身边的朋友有的选择了勇敢创业,有的则在技术的海洋中默默耕耘。时常在深夜反思,作为一个开发者,我们的价值何在?答案或许就在那行代码中,润物细无声。以下是我在日常开发中封装的一个弹窗管理工具——CLPopoverManager,希望能为

iOS开发基础135-Core Data

Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省时间,还能减少编程错误。以下是使用 Core Data 的详细介绍,包括示例代码,以及深入底层的一些