IOS屏幕旋转思路和实践
这段时间同事在做一个直播项目,项目有个需求:一个界面需要手动设置屏幕的方向,设置好之后方向不能变化。完成这个需求花了特别大的精力,归因是网上关于屏幕旋转的知识比较凌乱,解决问题花费不少时间,最后决定把这些知识总结哈,以给后面遇到问题的同仁一点参考。
首先我们来看一些基础知识:
(一)如何单独的控制某个界面是否可以旋转?
自IOS6之后,屏幕旋转的方法就变为下面2个方法:
-(BOOL)shouldAutorotate //是否允许控制器旋转屏幕 -(UIInterfaceOrientationMask)supportedInterfaceOrientations //允许的方向有哪些
理论上来说,我们要控制某个界面是否旋转和其允许的旋转的方向,只需在相应的控制器中实现这两个方法,便能实现我们的需求。但是有2种较特殊情形需要考虑,即控制器被包含在UINavigationController和UITabBarController,这2类控制器为其他控制器提供容器。如果我们需要控制屏幕旋转的某个控制器从属于这2类控制器,则界面方向由UINavigationController和UITabBarController中控制屏幕旋转的两个方法确定。(我是用UINavigationController来实践,如果UITabBarController有差异,可适当调整)。但如果控制器A直接用模态方式推出(presentViewController方式),则我们可以直接在该控制器中实现屏幕旋转方向即可,系统会自动调用控制屏幕旋转的方法。
有必要对从属这个概念解释下:如果一个控制A从属于UINavigationController B.那么在B的viewControllers属性中则会包含A。一般我们用的pushViewController方式推出控制器A,系统就会将其加入到B的viewControllers。
对于从属方式的控制器,设置屏幕的自动旋转,我们只需在系统调用UINavigationController的shouldAutorotate或supportedInterfaceOrientations方法的返回值中,主动调用从属控制器的相应方法,将其返回值作为容器类控制器的结果即可,具体操作如下:
//在UINavigationControllers实现该方法
- (BOOL)shouldAutorotate
{
return self.topViewController.shouldAutorotate;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations; }
//然后在从属于UINavigationControllers的控制器中重写上面2个方法即可实现每个界面单独控制屏幕旋转
(二)如何根据某个事件,调整屏幕的方向?
常用的屏幕旋转方向有2种:一种是改变改变view.transform的属性;另外一种是强制调用屏幕旋转方法。具体可参考下面链接:
http://blog.csdn.net/starryheavens/article/details/8083644
本文选择第二种——强制屏幕旋转,经证实可行,具体代码如下:
-(void)setOrientation:(UIInterfaceOrientation) oritation
{ SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
NSInteger val = oritation;
[invocation setArgument:&val atIndex:2];
[invocation invoke];
}
需要强调的是,在调用上面方法设置屏幕旋转方向时,系统会检测该控制器是否允许旋转,即调用shouldAutorotate,如果该方法返回NO,调用上述方法无用。
(三)实现最开始需求
思路:需求中,用户不操作时,则不允许屏幕旋转,因此shouldAutorotate返回值应该是NO,但是触发某个事件,需要将屏幕设置相应的状态时,我们必须在调用setOrientation:方法之前将shouldAutorotate的返回值设置为YES,当调用setOrientation:完毕,我们需要将shouldAutorotate的返回值设置成NO。
因此,我们定义一个属性allowRotate来表示是否允许屏幕旋转,具体代码如下:
@property (nonatomic,assign) BOOL allowRotate;//是否允许屏幕旋转的变量 -(BOOL)shouldAutorotate
{
return _allowRotate;
} 触发事件
-(void)screenRotateClick
{ _allowRotate = YES;
[self setOrientation:UIInterfaceOrientationPortraitUpsideDown];
_allowRotate = NO; }
希望本文写的一些知识能够帮助到你!
IOS屏幕旋转思路和实践的更多相关文章
- iOS屏幕旋转 浅析
一.两种orientation 了解屏幕旋转首先需要区分两种orientation 1.device orientation 设备的物理方向,由类型UIDeviceOrientation表示,当前设备 ...
- 【转】IOS屏幕旋转与View的transform属性之间的关系,比较底层
iTouch,iPhone,iPad设置都是支持旋转的,如果我们的程序能够根据不同的方向做出不同的布局,体验会更好. 如何设置程序支持旋转呢,通常我们会在程序的info.plist中进行设置Suppo ...
- ios 屏幕旋转的问题
在ios6之前我们旋转屏幕只需要实现shouldAutorotateToInterfaceOrientation就行了 - (BOOL)shouldAutorotateToInterfaceOrien ...
- iOS 屏幕旋转 nav+tabbar+present(网页) 2016
如题,最近一个app架构为 nav + tabbar ,需求是 在点击tabbar中的一个菜单项时,弹出网页,该网页需要横屏显示,其他页面不变 都保持竖屏. XCode Version 7.2.1 ...
- iOS屏幕旋转
三种方法 需求:全局主要是竖屏 个别界面需要横屏
- 【转】IOS设备旋转的内部处理流程以及一些【优化建议】
加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向: typedef NS_ENUM(NSInteger, UIDeviceOrienta ...
- OpenGL ES 响应屏幕旋转 iOS
iOS下使用OpenGL 如果使用GLKit View 那么不用担心屏幕旋转的问题,说明如下: If you change the size, scale factor, or drawable pr ...
- OpenGL ES: iOS 自定义 UIView 响应屏幕旋转
iOS下使用OpenGL 如果使用GLKit View 那么不用担心屏幕旋转的问题,说明如下: If you change the size, scale factor, or drawable pr ...
- ios实现屏幕旋转的方法
1.屏蔽AppDelegate下面的屏幕旋转方法 #pragma mark - 屏幕旋转的 //- (UIInterfaceOrientationMask)application:(UIApplica ...
随机推荐
- Vim+Taglist+AutoComplPop之代码目录分栏信息和自动补全提示(Ubuntu环境)
一步: 首先在Ubuntu环境中安装ctags: sudo apt-get install ctags 第二部: 安装Taglist-------------Taglist是vim的一个 ...
- CSS:与input相关的一些样式设置问题
input是HTML中非常重要,非常常用而又不可替代的元素,在于其相关的样式设置中有时会遇到其他元素不会发生的问题,今天把我印象中的一些小问题和解决方案记录一下. 1.与同行元素上下居中对齐 关于上下 ...
- 今天想写一下关于SpringMVC的视图解释器
昨天我写了一下SpringMVC最爱金丹的项目的配置流程,这样搭建完项目之后呢我发现我每个请求都得加个.do什么的后缀,这让我开发得很不爽,于是呢今天就想配置一下这个试图解释器,这样做的目的有两个:第 ...
- arch xfce快捷键
<Alt>F1:xfce4-popup-applicationsmenu 打开右键菜单 <Alt>F2:xfrun4 打开应用程序运行窗口,同<Alt>F3差不多 ...
- 更改Windows更新源(解决公司内部网络无法下载语言包或更新的问题)
打开注册表 找到HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate 将WUServer.WUStatusServe ...
- Consider defining a bean of type 'com.lvjing.dao.DeviceStatusMapper' in your configuration.
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBra ...
- erlang开发工具之intellij idea基本使用
其他废话就不多说了,接下来主要是介绍怎么来用idea搭建项目让我们能更好的使用好开发工具. (这边假设你已经下载好了intellij idea关于erlang的插件,如果没有安装好,请先去google ...
- Xcode注释转文档appledoc使用
参考了一些大神的方法总算成功了记录一下少走弯路 1:安装appledoc 使用终端下载: 命令行: git clone git://github.com/tomaz/appledoc.git cd . ...
- CSS学习笔记_day2
目录 一. css初识 二. 在HTML里面引入css的几种方式 1. 外部引入式 2.文档内嵌式 3. 行内式(元素内嵌式) 三. 选择器 四.盒模型 五.文档标准流 六.浮动 一. css初识 1 ...
- leetcode 813. Largest Sum of Averages
对于一个数组中的数进行分组,取每个组里的平均值进行加和的. 使用动态规划,其中dp[i][k]表示以i为结尾的有k个分组的,那么递推式为: dp[i][k]=dp[j][k-1]+(sum[i]-su ...