当前位置: 传客网 > 界面旋转,改变Orientation的三种途径

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

2017-01-11 作者:AwakenNull

. 这样:

首先我们得知道:

  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度旋转,最终撞上路中间的

  • 杭州同济医院灰指甲的传播途径一般有哪些

      灰指甲的传播途径一般有哪些?  不知道大家对灰指甲的传播途径是否了解,生活中,灰指甲患者有上升趋势,也有越来越多的人进行治疗。大家对灰指甲的传播途径了解多少呢?下面,就让专家们来为大家介绍下,灰指甲的传播途径有哪些。  灰指甲患者往往不

  • 成员读书——《教师专业成长的途径》读后

    《教师专业成长的途径》读后感公岭中心学校郝丽君寒假期间,通过纪继兰老师的推荐,我阅读了对当前教师成长有益的一些书籍,如《教师专业成长的途径》、《教师的第九个小时》、《时文选粹》等,其中让我印象最深的一本书是《教师专业成长的途径》。这本书是由

  • 不同学历留学西班牙的不同途径

    不同学历留学西班牙的不同途径:  高中毕业生  途径1:选择私立大学。  途径2:就读高等职业学院,无入学考试,读完3年后可衔接到公立大学相应阶段。  途径3:必须参加西班牙大学入学考试才可以进入公立大学本科四年制的学习阶段,入学考试主要是

  • 浅析聚氨酯旋流器企业扩张的主要途径

      企业如果想扩大,那就应选择好的发展途径。良好的发展途径可以使企业蒸蒸日上,因此,我们说聚氨酯旋流器企业扩张选择途径很重要。  通常来说,聚氨酯旋流器企业扩张的途径有两种:  其一是资本积聚式扩张。  这种方式也称内部扩张或由内向外扩张,

  • 知识共享途径选择研究

    知识共享途径选择研究企业员工将知识共享给同事的途径有两种:编码化(codification)和人际化(personalization)。现有文献假设知识的价值在共享过程中不随时间变化,员工权衡报酬模式和知识失真程度,在两种途径间进行选择。但

  • 论法规育德:大学生道德养成教育的重要途径

    论法规育德:大学生道德养成教育的重要途径论文摘要:大学生的道德养成教育是一个系统工程,它的途径也是多样的。本文认为,法规育德是大学生道德养成教育的一个重要途径。文中从德与法的共性以及个体道德意识形成和发展的规律两个方面分析了法规育德的依据,

  • 通过何种途径传递信息

      对市场营销人士来说,最困难的是如何深入了解消费者的思维并将自己的信息传达到他们的脑子里。这就是一个途径的问题。只要你找到一条合适的途径,将信息移植进去,接下来的事情就是坐收消费者慢慢接受产品与服务的“渔利”了。    那通过何种途径来传

  • 连续发生两个重大医疗事故后走法律途径投诉无门的惨痛经历

    连续发生两个重大医疗事故后走法律途径投诉无门的惨痛经历连续发生两个重大医疗事故后走法律途径投诉无门的惨痛经历天涯作者:天黑了S江西省医学会与宜丰县医院钟小明、万训等串通起来伪造病历让专家做虚假鉴定,走法律途径投告无门的惨痛经历  我母亲胡恒