界面旋转,改变Orientation的三种途径

ios

. 这样:

首先我们得知道:

  1. 当手机的重力感应打开的时候, 如果用户旋转手机, 系统会抛发UIDeviceOrientationDidChangeNotification

 事件.

  • 您可以分别设置Application(IOS5和IOS6有所不同,下面会详细解释).
  • UIKit事件的时候, 会根据的设置, 如果双方都支持此方向, 则会自动屏幕旋转到这个方向. 更code的表达就是, 会对两个设置求异常.

Info.plist设置

在App的Info.plist里设置:


在Info.plist中设置之后,这个app里所有的viewController

支持的自动旋转方向都只能是app支持的方向的子集.

UIViewController

IOS6 and above

supportedInterfaceOrientations

在IOS6及以上的版本中, 增添了方法UIViewController.supportedInterfaceOrientations

. 此方法返回当前viewController支持的方向. 但是, 只有两种情况下此方法才会生效:

  1. 当前viewController.
  • 当前viewController而显示出来的.

  • UIViewController.supportedInterfaceOrientations

方法会作用于当前viewController和所有childViewController. 以上两种情况之外, UIKit并不会理会你的supportedInterfaceOrientations方法.

举个例子:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}

如果某个viewController

实现了以上方法. 则, 此viewController就支持竖方向和左旋转方向. 此viewController的所有childViewController也同时支持这两个方向, 不多不少.

preferredInterfaceOrientationForPresentation

此方法也属于UIViewController

. 影响当前viewController的初始显示方向. 此方法也仅有在当前viewControllerrootViewController或者是modal模式时才生效.

shouldAutorotate

此方法,用于设置当前viewController

是否支持自动旋转. 如果,你需要viewController暂停自动旋转一小会儿. 那么可以通过这个方法来实现.同样的, 此方法也仅有在当前viewControllerrootViewController或者是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;

需要注意的是:

  1. 当然我们可以对当前viewController, 当然也可以, help yourself~
  • 我们需要显式的设置bounds

UIKit并不知道你偷偷摸摸干了这些事情, 所以没法帮你自动设置.

如何应付产品经理的需求

有了以上三把武器, 我想基本可以应付BT产品经理所有的需求了. 但是这里还有一些小技巧.

直接锁死

(略)

随系统旋转

IOS5及之前

对于IOS5及之前的版本, 只要在对每个viewController

重写shouldAutorotateToInterfaceOrientation方法, 即可方便的控制每个viewController的方向.

IOS6及以后

对于IOS6及以后的版本, 如果想方便的单独控制每个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的方法来实现.



摘自:http://www.cnblogs.com/jhzhu/p/3480885.html​



相关推荐

  • 【财务决策】财务管理创造企业价值的三种途径 【财务决策】财务管理创造企业价值的三种途径企业财务管理目标是企业经营目标在财务上的集中和概括,是财务管理工作的定向机制、出发点和归宿。综合我国目前企业的实际情况和市场经济条件下对企业财务管理的要求,笔者认为,财务状况最优化是市场经济条件下的
  • 关于鼠标经过时改变DIV背景颜色的三种途径 这里向大家简单介绍一下如何让鼠标经过时改变DIV背景颜色,当鼠标经过的时候改变网页和层的DIV背景颜色,应该会有很多的方法,目前整理出来比较常用的三种方法,相信本文介绍一定会让你有所收获。三种方法鼠标经过改变DIV背景颜色当鼠标经过的时候改
  • 财务管理创造企业价值的三种途径(摘) 企业财务管理目标是企业经营目标在财务上的集中和概括,是财务管理工作的定向机制、出发点和归宿。综合我国目前企业的实际情况和市场经济条件下对企业财务管理的要求,笔者认为,财务状况最优化是市场经济条件下的我国财务管理目标的现实选择。  目前关于企
  • 苹果应用在网店遭贱卖 开发者解密背后三种途径 去年,一款名为FruitNinja(水果忍者)的游戏在进入苹果应用程序商店AppStore后,凭借简单有趣的操作迅速登上排行榜前列。在游戏开发商HalfbrickStudios日进斗金的同时,苹果也获得了丰厚的收益。    但是,这样简单有
  • 三翼自动旋转门滑环结构及采用的材料 旋转门集聚各种门体优点于一身,其宽敞和高格调的设计营造出奢华的气氛,堪称建筑物的点睛之笔。旋转门增强了抗风性,减少了空调能源消耗,是隔离气流和节能的最佳选择。最适合于饭店、机场、大型商场、医院、商户会馆、酒店、办公楼、大型大厦等的出入口。旋
  • 专升本的途径有哪些? 专升本是当下大专班提升学历的重要途径。但是专升本平飞只有统招专升本这一种方式,那么,专升本的途径有哪些呢?专升本的途径:1、成人高考升本专科毕业工作一年后,可通过全国成人高考中的专升本考试进入成人院校学习,一般不脱产或半脱产。2、自考升本高
  • 净邦 旋转拖把好不好,旋转拖把哪个牌子好(已有2933人评价) 净邦旋转拖把好不好,旋转拖把哪个牌子好更多详情和评价,点击进入正品官方旗舰店>>>>以下是网友对净邦旋转拖把好不好,旋转拖把哪个牌子好的评价已经买了第二回了,挺好用的质量还行,挺轴实的,好用,第三次购买了。好评满意此
  • CFturbo-泵及旋转机械设计免费网络培训 尊敬的阁下:您好!近年来,随着计算机技术的发展,如何根据旋转机械的性能要求,快速高效地设计出符合要求的泵、风机、压缩机、涡轮CAD模型已成为深入应用CAE技术的一大瓶颈。为此,海基科技特邀请您参加12月14日(星期五)14:30举行的“CF
  • 教你ChemDraw旋转结构的三种形式 ChemDrawPro15是一款专业的化学结构式绘图编辑软件,能够建立和编辑各类分子式、方程式、结构式、立体图形、对称图形、轨道等,并能对图形进行翻转、旋转、缩放、存储、复制、粘贴等多种操作。本教程主要介绍ChemDrawPro15旋转化学
  • 2017年考生必看:15种北京高考升学途径 随着高三复习备考逐步深入,不少学生和家长已开始为升学路径进行深入的选择和规划,盘点历年的升学详情,下文共梳理出15种北京高考升学途径,2017年的准高考生和家长们都科普一下吧~除了大家相对比较了解的普通高考、艺考、自主招生以外,还有专项计划
  • 万嘉利 旋转拖把怎么样,好不好(已有3094人评价) 万嘉利旋转拖把怎么样,好不好更多详情和评价,点击进入正品官方旗舰店>>>>以下是网友对万嘉利旋转拖把怎么样,好不好的评价非常愉快的一次购物,快速特给力,物超所值!全五星好评。还没用,看着很不错。用后追加回家用了一下,
  • 沈海高速雨天路滑 大客车360度旋转甩出 沈海高速雨天路滑大客车360度旋转甩出多人(图)  多名乘客被送医院治疗。范木晓子摄  大客车高速上侧翻。图片来自收集  昨天下午,沈海高速G15东台段发生一起惨烈车祸,一辆盐城滨海开往上海的大客车在高速上发生360度旋转,最终撞上路中间的

你的评论

就没有什么想说的吗?

©2017传客网    琼ICP备15003173号-2    

本站部分文章来源于互联网,版权归属于原作者。
本站所有转载文章言论不代表本站观点,如是侵犯了原作者的权利请发邮件联系站长(weishubao@126.com),我们收到后立即删除。
站内所有资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己承担!

X