以下内容是在IOS7和IOS8系统验证得到的结论

1.首先,在iOS8之前的[UIScreenmainScreen].bounds和 [UIScreen mainScreen].applicationFrame两者的区别在于:

1)[UIScreenmainScreen].bounds:指固定的屏幕尺寸(宽高固定)

2)[UIScreenmainScreen].applicationFrame:指除却状态栏后的固定的屏幕尺寸

比如对于 iPhone4而言,无论屏幕怎么旋转 [UIScreen mainScreen].bounds都是固定的(0,0,320,480); [UIScreenmainScreen].applicationFrame都是固定的(0,20,320,460);

2.但是在iOS8 中[UIScreenmainScreen].bounds 和 [UIScreen mainScreen].applicationFrame两者不再是固定不变的。

当旋转的时候,屏幕也会发生改变。/这是在iOS8中影响选择适配的一个原因。

iOS 7之前Window的bounds不会随着方向而变化,但是到了iOS 8以后,随着设备方向的旋转,window.bounds.size.width和window.bounds.size.height也会相应发生变化。

同样受影响的还有键盘弹起和消失的通知中[[[notificationuserInfo] objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue]的值,iOS7是以没有旋转的window坐标系为标准计算的,而iOS8是以旋转后的window坐标系为标准计算的。

还有[UIApplicationsharedApplication].statusBarFrame的尺寸也是同样的道理。

XCode6 +iOS8SDK+iOS8设备:

iPad横屏情况下

[[UIScreen mainScreen] bounds]:{{0, 0},{1024, 768}}

[[UIScreen mainScreen]applicationFrame:{{0, 20}, {1024, 748}}

iPad竖屏情况下

[[UIScreen mainScreen] bounds]:{{0, 0},{768, 1024}}

[[UIScreen mainScreen]applicationFrame:{{0, 20}, {768, 1004}}

XCode5 +iOS7SDK+iOS7设备(或者XCode6+iOS8SDK+iOS7)
iPad横屏情况下
[[UIScreenmainScreen] bounds]:{{0, 0}, {768, 1024}}
[[UIScreen mainScreen]applicationFrame:{{20, 0}, {748, 1024}}
iPad竖屏情况下
[[UIScreenmainScreen] bounds]:{{0, 0}, {768, 1024}}
[[UIScreen mainScreen]applicationFrame:{{0, 20}, {768, 1004}}

XCode6 +iOS8SDK+iOS8设备:

iPhone横屏情况下
[[UIScreenmainScreen] bounds]:{{0, 0}, {568, 320}}
[[UIScreen mainScreen]applicationFrame:{{0, 0}, {568, 320}}

[[notificationuserInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue] keyboardWillShow: {{0,127}, {568, 193}}

iPhone竖屏情况下
[[UIScreenmainScreen] bounds]:{{0, 0}, {320, 568}}
[[UIScreen mainScreen]applicationFrame:{{0, 20}, {320, 548}}

[[notificationuserInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue] keyboardWillShow:{{0, 315}, {320, 253}}

XCode5 +iOS7SDK+iOS7设备(或者XCode6+iOS8SDK+iOS7)

iPhone横屏情况下

[[UIScreen mainScreen] bounds]:{{0, 0},{320, 568}}

[[UIScreen mainScreen]applicationFrame:{{0, 0}, {300, 568}}

[[notificationuserInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue] keyboardWillShow: {{158,0}, {162, 568}}

iPhone竖屏情况下
[[UIScreenmainScreen] bounds]:{{0, 0}, {320, 568}}
[[UIScreen mainScreen] applicationFrame:{{0,20}, {320, 548}}

[[notificationuserInfo][UIKeyboardFrameEndUserInfoKey]CGRectValue] keyboardWillShow: {{0, 264}, {320, 216}}

如果代码中有依赖UIScreen的bounds属性、UIWindow的bounds属性、键盘通知中UIKeyboardFrameEndUserInfoKey值、[UIApplication sharedApplication].statusBarFrame的地方,那么在用XCode6+iOS8SDK发布新版本前就要高度注意了

 

 

 

ios 旋转问题分强制和非强制2种大情况:

1、       众所周知,在我们的工程设置中有横竖屏的设置选项如下图:

如果只勾选Portrait则整个工程只支持竖屏,所有的界面都不能旋转,即使使用了像这样的强制旋转代码[[UIDevice currentDevice] setValue:[NSNumbernumberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];也无济于事。

那么对于一个工程只有个别界面需要旋转只勾选Portrait当然是不能旋转的,如果打开LandscapeRight或LandscapeLeft那整个工程都旋转了,就达不到只让个别界面旋转的目地。其实,对于这种情况一般人的做法是弄个UINavigationController然后

-(NSUInteger)supportedInterfaceOrientations

{

return [self.topViewController supportedInterfaceOrientations];

}

- (BOOL)shouldAutorotate

{

return [self.topViewController shouldAutorotate];

}

可以解决问题!不过这样做可能为以后留下坑(其他界面忘记做处理出现界面混乱现象)。对于这种个别界面旋转情况其实完全可以这样做:就是只勾选Portrait则整个工程只支持竖屏。也不用弄什么UINavigationController然后,直接在AppDelegate中实现这个方法:

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

{

//if([[self.window.rootViewController.navigationController.viewControllerslastObject] isKindOfClass:[PlayViewController class]])

if(self.makeOrientation == UIInterfaceOrientationLandscapeRight)

{

return UIInterfaceOrientationMaskLandscapeRight;

}

else

{

return UIInterfaceOrientationMaskPortrait;

}

}

即可!注意:self.makeOrientation属性是一个全局的目地就是以后方便哪个界面要旋转就设置成相应的旋转枚举。我一般是在点击事件触发的时候设置一下,再取消旋转的触发事件再次恢复设置。推动界面旋转的方法有2种,第一种:[[UIDevice currentDevice] setValue:[NSNumbernumberWithInteger:UIDeviceOrientationLandscapeLeft]forKey:@"orientation"];

第二种:

if ([[UIDevice currentDevice]respondsToSelector:@selector(setOrientation:)]) {

SEL selector = NSSelectorFromString(@"setOrientation:");

NSInvocation *invocation = [NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:selector]];

[invocation setSelector:selector];

[invocation setTarget:[UIDevice currentDevice]];

int val = UIInterfaceOrientationLandscapeRight;

[invocation setArgument:&val atIndex:2];

[invocation retainArguments];

[UIViewController attemptRotationToDeviceOrientation];

[invocation invoke];

}苹果都可以审核通过。而此时没有使用任何shouldAutorotate  supportedInterfaceOrientations方法。

所以现在的问题是:有了方法supportedInterfaceOrientationsForWindow什么时候用shouldAutorotate  supportedInterfaceOrientations方法?还会起作用吗?他们俩是什么关系?至今没有发现。

还有一个地方需要注意:实现了方法supportedInterfaceOrientationsForWindow后就屏蔽了工程设置选项。也就是说,此时那4个单选框无论怎么勾选都不起作用了,整个工程界面的旋转都以这个方法为切入点。无论工程设置成什么样,有没有实现shouldAutorotate  supportedInterfaceOrientations方法,任何时候执行强制旋转或往东南西北转动设备这个方法都会回调的,仔细观察发现这个方法的实现返回的枚举值都必须是带有Mask的字样,这个Mask起位掩码的作用,它是基于currentDevice的方向Orientation值做相应的旋转变化,将要设置的位和当前设备的方向位做位掩。比如:当前设备(home键)的方向已经和你设置的旋转UIDeviceOrientationLandscapeLeft方向一致了,那你触发旋转的时候界面不动还是此时的方向,相反如果你的(home键)的方向和要设置的方向不一样那界面会做旋转变化不一定都是旋转90°。

有的人说这个方法只对于present出来的界面起作用,那是不完全正确,因为官方说了This method returns the total set of interfaceorientations supported by the app. When determining whether to rotate aparticular view controller, the orientations returned by this method areintersected with the orientations supported by the root view controller ortopmost presented view controller. The app and view controller must agreebefore the rotation is allowed.

这是我设置的pushViewController截图如下

所以照样可以旋转。官方还 说了If you do not implement this method, the app uses the values in the UIInterfaceOrientation key of the app’s Info.plist as the default interface orientations.如果没有实现这个方法旋转的时候就去从工程设置取值来呈现相应方向的界面,这也就是前面说的实现这个方法会屏蔽工程设置。

对于做视频横屏播放的情况下:做旋转有3种方法。

第一种:就是网上说的用旋转矩阵方法CGAffineTransformMakeRotation来做,直接旋转某个view,之后setFrame,至于状态栏,全屏横屏之后就隐藏吧。这种方法有个弊端是音量图标不能随着一起旋转,QA到时候会挑BUG。

第二种:就是打开工程设置前面也说了弄个导航控制器。

第三种:就是前面说的- (NSUInteger)application:(UIApplication *)applicationsupportedInterfaceOrientationsForWindow:(UIWindow *)window方法。

这三种方法各有特点,对于多界面横屏适合第二种方法,对于个别界面横屏适合第三种方法。

iOS7到iOS8 一个通用的横竖屏幕切换总结相关推荐

  1. android 横竖屏幕切换,Android 横竖屏切换总结

    一.Android切换横竖屏 应用的横竖屏设置 应用的横竖屏设置主要是通过Activity的screenOrientation属性控制,属性值如下: 主要有以下两种方式设置screenOrientat ...

  2. android 横竖屏幕切换

    Android开发中,大多APP可能根据实际情况直接将APP的界面方向设死了,或竖屏或横屏.但是,我们还是会遇到横竖屏切换的功能需求,不管是通过物理重力感应触发,还是用户手动触发.所以,我们有必要去弄 ...

  3. Android适配自己总结的心德 同时适配手机和平板 同时适配横竖屏幕切换

    前言:关于这个问题就设计到了很多单位了,什么px.pt.dp.sp,手机尺寸,ppi等等,我这里只介绍我解除过比较靠谱的.如果你有更好的屏幕适配方案,请在评论区留下链接.非常感谢 一.最小宽度 限定符 ...

  4. Android 横竖屏幕切换监听

    工作中用到播放视频时,需要横屏将视频全屏播放,所以需要监听屏幕的横竖屏切换事件. @Overridepublic void onConfigurationChanged(Configuration n ...

  5. Android 横竖屏幕切换(layout-land和layout-port)

    1.首先通过以下语句设置Activity为无标题和全屏模式: 1 // 设置为无标题栏 2 requestWindowFeature(Window.FEATURE_NO_TITLE); 3 4 // ...

  6. Android横竖屏切换小结

    (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.com/franksunny/635350788930000000.pdf) Android手机或平板都会存在横竖 ...

  7. Android横竖屏切换相关知识点

    转载自:http://www.cnblogs.com/franksunny/p/3714442.html (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.com/ ...

  8. Android横竖屏切换小结(重建、非重建Activity)

    来自:http://www.cnblogs.com/franksunny/p/3714442.html (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.com/f ...

  9. Android 横竖屏切换小结

    (自己体会:每次横竖屏自动切时都会run Activity的onCreate,即相当后重新进入Activity初始化一样:) 转自:http://www.cnblogs.com/franksunny/ ...

最新文章

  1. 泛型的作用是什么?——Java系列学习笔记
  2. 邮政银行贷款迟还4个小时就造成信用逾期,如何解决?
  3. safari图片跨域
  4. Castle ActiveRecord学习实践(2):构建配置信息
  5. 【算法1-2】排序(今天刷洛谷了嘛)
  6. linux 限额系统,Linux磁盘限额(quota)
  7. 【lucene】lucene自定义评分
  8. 数据库开启了闪回和归档,关闭归档日志alter database noarchivelog的时候报错:ORA-38781: cannot disable media recovery
  9. 第三章 磁共振成像原理
  10. Android逆向工程:MIUI系统大揭秘:去不掉的小米账号!
  11. 全面理解 DNS 及 HTTPDNS
  12. 为老电脑装linux系统
  13. 递归函数的例子python卖鸭子_递归算法实现卖鸭子
  14. c语言数组文曲星猜数游戏编程,关于文曲星上猜数字游戏的c编程方法
  15. MSDC 4.3 接口规范(27)
  16. 你认为的CISP这个证书是怎么样的
  17. markdown编辑器的基础语法
  18. git idea创建新分支,获取/合并主支代码的2个方法
  19. Uncaught TypeError: Cannot read property ‘dispatch‘ of undefined
  20. 大学生计算机面试,大学生计算机毕业面试自我介绍

热门文章

  1. 最好用的PS一键智能抠图插件,3秒就能扣好一张图
  2. TO B是什么?TO C呢?
  3. 【fpdlink】FPDlink接口---TI954解串器功能分析
  4. 本机无法 正常连接到桌面端Ubuntu虚拟机
  5. Python开发图形可视化界面程序(一)
  6. 为什么戴耳机听歌时候耳朵痛?那是你没用到对的耳机
  7. c语言法定节日日历程序,一个完整的日历程序(含有农历)
  8. io端口与ion内存
  9. Python程序员爬出百套美女写真集,同样是爬虫,他为何如此突出?
  10. BlackHat DEFCON现场秀:阿里安全专家演示“视频水印叠加”和“一分钟越狱iOS 11.4”...