热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

以下内容是在IOS7和IOS8系统验证得到的结论1.首先,在iOS8之前的[UIScreenmainScreen].bounds和[UIScreenmainScreen].applica

以下内容是在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}}

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

 

 

 

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

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

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

那么对于一个工程只有个别界面需要旋转只勾选Portrait当然是不能旋转的,如果打开LandscapeRightLandscapeLeft那整个工程都旋转了,就达不到只让个别界面旋转的目地。其实,对于这种情况一般人的做法是弄个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方法。

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


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
author-avatar
超级独自旅行也快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有