问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

IOS Orientation,想怎么转就怎么转

发布网友 发布时间:2022-04-23 06:11

我来回答

1个回答

热心网友 时间:2023-09-03 12:59

首先我们得知道:
当手机的重力感应打开的时候, 如果用户旋转手机, 系统会抛发UIDeviceOrientationDidChangeNotification 事件.
您可以分别设置Application和UIViewcontroller支持的旋转方向.Application的设置会影响整个App, UIViewcontroller的设置仅仅会影响一个viewController(IOS5和IOS6有所不同,下面会详细解释).
当UIKit收到UIDeviceOrientationDidChangeNotification事件的时候, 会根据Application和UIViewcontroller的设置, 如果双方都支持此方向, 则会自动屏幕旋转到这个方向. 更code的表达就是, 会对两个设置求与,得到可以支持的方向. 如果求与之后,没有任何可支持的方向, 则会抛发UIApplicationInvalidInterfaceOrientationException异常.

Info.plist设置
在App的Info.plist里设置:

key
xcode name
Summary
avilable value

UIInterfaceOrientation initial interface orientation Specifies the initial orientation of the app’s user interface. UIInterfaceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft,
UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations Supported interface orientations Specifies the orientations that the app supports. UIInterfaceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft,
UIInterfaceOrientationLandscapeRight
在Info.plist中设置之后,这个app里所有的viewController支持的自动旋转方向都只能是app支持的方向的子集.

UIViewController
IOS6 and above
supportedInterfaceOrientations
在IOS6及以上的版本中, 增添了方法UIViewController.supportedInterfaceOrientations. 此方法返回当前viewController支持的方向. 但是, 只有两种情况下此方法才会生效:
当前viewController是window的rootViewController.
当前viewController是modal模式的. 即, 此viewController是被调用presentModalViewController而显示出来的.
在以上两种情况中,UIViewController.supportedInterfaceOrientations方法会作用于当前viewController和所有childViewController. 以上两种情况之外, UIKit并不会理会你的supportedInterfaceOrientations方法.
举个栗子:
- (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;}

如果某个viewController实现了以上方法. 则, 此viewController就支持竖方向和左旋转方向. 此viewController的所有childViewController也同时支持这两个方向, 不多不少.
preferredInterfaceOrientationForPresentation
此方法也属于UIViewController. 影响当前viewController的初始显示方向. 此方法也仅有在当前viewController是rootViewController或者是modal模式时才生效.
shouldAutorotate
此方法,用于设置当前viewController是否支持自动旋转. 如果,你需要viewController暂停自动旋转一小会儿. 那么可以通过这个方法来实现.同样的, 此方法也仅有在当前viewController是rootViewController或者是modal模式时才生效.
IOS5 and before
在IOS5和以前的版本中, 每个viewController都可以指定自己可自动旋转的方向.(这样不是挺好么?苹果那帮工程师为啥要搞成这样...).
每当UIkit收到UIDeviceOrientationDidChangeNotification消息的时候, 就会用以下方法询问当前显示的viewController支不支持此方向:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation{ if ((orientation == UIInterfaceOrientationPortrait) || (orientation == UIInterfaceOrientationLandscapeLeft)) return YES; return NO;}

特别要注意的是:你必须至少要对一个方向返回YES.(为难系统总不会有啥好事儿,你懂得).

UIView.transform
最后一个方法是设置UIView的transform属性来强制旋转.
见下代码:
//设置statusBar[[UIApplication sharedApplication] setStatusBarOrientation:orientation];//计算旋转角度float arch;if (orientation == UIInterfaceOrientationLandscapeLeft) arch = -M_PI_2;else if (orientation == UIInterfaceOrientationLandscapeRight) arch = M_PI_2;else arch = 0;//对navigationController.view 进行强制旋转self.navigationController.view.transform = CGAffineTransformMakeRotation(arch);self.navigationController.view.bounds = UIInterfaceOrientationIsLandscape(orientation) ? CGRectMake(0, 0, SCREEN_HEIGHT, SCREEN_WIDTH) : initialBounds;

需要注意的是:
当然我们可以对当前viewController进行旋转, 对任何view旋转都可以.但是, 你会发现navigationBar还横在那里. 所以, 我们最好对一个占满全屏的view进行旋转. 在这里我们旋转的对象是self.navigationController.view, 当然self.window也可以, help yourself~
我们需要显式的设置bounds. UIKit并不知道你偷偷摸摸干了这些事情, 所以没法帮你自动设置.

如何应付产品经理的需求
有了以上三把武器, 我想基本可以应付BT产品经理所有的需求了. 但是这里还有一些小技巧.
直接锁死
(略)
随系统旋转
IOS5及之前
对于IOS5及之前的版本, 只要在对每个viewController重写shouldAutorotateToInterfaceOrientation方法, 即可方便的控制每个viewController的方向.
IOS6及以后
对于IOS6及以后的版本, 如果想方便的单独控制每个viewController的方向. 则可以使用这样:
对于非modal模式的viewController:
如果不是rootViewController,则重写supportedInterfaceOrientations,preferredInterfaceOrientationForPresentation以及shouldAutorotate方法, 按照当前viewController的需要返回响应的值.
如果是rootViewController,则如下重写方法:
-(NSUInteger)supportedInterfaceOrientations{ return self.topMostViewController.supportedInterfaceOrientations;}-(BOOL)shouldAutorotate{ return [self.topMostViewController shouldAutorotate];}- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ return [self.topMostViewController preferredInterfaceOrientationForPresentation];}-(UIViewController*)topMostViewController{ //找到当前正在显示的viewController并返回.}

显而易见, 我们巧妙的绕开了UIKit只调用rootViewController的方法的规则. 把决定权交给了当前正在显示的viewController.
对于modal模式的viewController. 则按照需要重写supportedInterfaceOrientations,preferredInterfaceOrientationForPresentation以及shouldAutorotate方法即可.
强制旋转
有时候, 需要不随系统旋转, 而是强制旋转到某一个角度. 最典型的场景就是视频播放器, 当点击了全屏按钮的时候, 需要横过来显示.
对于IOS5及以前的版本, 可以用下面的方法:
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { SEL selector = NSSelectorFromString(@"setOrientation:"); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]]; [invocation setSelector:selector]; [invocation setTarget:[UIDevice currentDevice]]; int val = UIInterfaceOrientationLandscapeRight; [invocation setArgument:&val atIndex:2]; [invocation invoke];}

对于IOS6及以后的版本. UIDevice.setOrientation从隐藏变为移除.只能通过设置UIView.transform的方法来实现.
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
男朋友比我小很多,现在他说没什么感觉,我该怎么去维持... 大众朗逸车门漏水到车内是什么原因 老朗逸车门进水完美解决办法 华硕B760m主板字母代表什么意思? 技嘉主板的型号字符各代表什么意思? 中考和高考哪个更难些? 中考跟高考,哪个更难?听别人说,中考有一般人是没考上高中的。甚至有人... 2019深圳企业500强 2019年深圳市百强企业 深圳500强企业名单一览_百度... 平安成立时间 优美的生活经典句子 让人惊艳的优美句子(特别经典的优美短句) 如何将ios转换成windows7 王者荣耀ios转安卓系统数据如何转过去? 华为手机如何使用转换IOS ios文件怎么转换成gho文件 王者荣耀ios怎么转安卓系统 王者荣耀怎么把ios转换 苹果的IOS系统和WINDOWS在MAC电脑上怎么切换? 央视我爱发明播出的煲饭新传,那个不锈钢不粘锅的电饭煲是什么牌子? 王者荣耀ios转安卓要多久 iOS如何将数组转换成 ios怎么数据转移 苏泊尔电饭煲哪款好用性价比高? 怎样把IOS文件转换成EXE文件 怎么把IOS 转换成 GHO文件 什么牌子的电饭煲好用,价格在一百以内。可以煲汤,不粘锅。谢谢 有什么电饭煲煮饭不会糊和不粘锅? iOS 怎么转换语言 哪个牌子的电饭煲不粘锅 想买个电饭煲,之前的苏泊尔保温久了会粘锅,推荐个不粘锅的,价格一千以内 什么电饭煲内胆涂层不会掉? 自己手机上怎么登录别人的? 回形针事件是怎么回事? 怎么看待回形针“地图”事件? 怎么登录别人微信? 怎样在电脑上登录别人的 回形针制作人回应“地图”事件说了什么的? 回形针是怎么发明的? 回形针如何正确使用? 如何登录别人的微信账号 什么是"回形针行动"? 为什么,那么多人洗回形针? 请问有谁知道 一个美国男孩用回形针换别墅的事情 他是在哪个网站上发布的消息 回形针的制造历史 回形针吞下去没事把 回形针和关针不是一回事吗,刚才买了两盒回来,老板说买错了,非常郁闷... 回形针的优点是什么? 平凡的世界 读后感400字 读平凡的世界写五篇读后感三四百字 平凡的世界 10篇读后感 300~400字 高中名著的读后感(400字)
  • 焦点

最新推荐

猜你喜欢

热门推荐