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

【原】UI随设备旋转从iOS6到iOS8的适配策略

-(void)statusBarOrientationChange:(NSNotification*)notification{WClassAndFunctionName;UI
- (void)statusBarOrientationChange:(NSNotification *)notification
{
WClassAndFunctionName;
UIInterfaceOrientation oriention = [UIApplication sharedApplication].statusBarOrientation;
[self adaptUIBaseOnOriention:oriention];
}

 

一般情况下,关于屏幕旋转的适配用view自带的autoresizingmask属性就能轻松适配宽度以及边距,而且从iOS6到iOS8通吃。不过,前提是“一般情况下”。当你需要在横屏与竖屏状态下让你封装的view有不同的布局,那autoresizingMask属性就显得力不重新了。这也是本文要解决的主要问题。

显然,检测视图旋转事件是必须要做的。一般我们封装一个自定义控件,总是希望调用者可以轻松的调用它,因此检测视图旋转也应该在控件内做。

开始检测视图旋转。

在init方法中注册通知

- (void)registerListeningDeviceOriention
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarOrientationChange:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
}

 一旦屏幕产生旋转,则调用statusBarOrientionChange:方法。比如:

- (void)statusBarOrientationChange:(NSNotification *)notification
{
WClassAndFunctionName;
UIInterfaceOrientation oriention = [UIApplication sharedApplication].statusBarOrientation;
[self adaptUIBaseOnOriention:oriention];//比如改变self.frame
}

然而,事情并不是那么顺利跟想当然的!当你满怀信心地在adaptUIBaseOnOriention方法中根据oriention做布局后会发现,iOS8跑出来的效果很完美,而非iOS8版本却乱七八糟。很多时候自定义view(以下简称superview)的subviews的布局要依赖于superview的size。所以一旦superview的frame没有适配好,那看起来就乱七八糟了!为什么会出现上述差异呢?根本原因是statusBarOrientationChange的触发时机依赖于ios版本。打log后发现,iOS8及以上的版本,statusBarOrientationChange在旋转结束后调用;在iOS8以下的版本,statusBarOrientationChange在旋转前调用。而如果你在statusBarOrientationChange方法中想当然地去读取当前的设备高度跟宽度,那必然产生差异!

总体思路是没错的,下一步就是在statusBarOrientationChange里面对当前的设备方向以及系统版本进行判断,这样才能取到真正的设备高度跟宽度,真正的设备高度宽度对于布局是至关重要的!

    CGFloat windowWidth = kDeviceWindowWidth4Panel;//iOS8不用更改
CGFloat windowHeight = kDeviceWindowHeight4Panel;
if (!IsIOS8orAbove) {
windowWidth = (!kIsDeviceLandscape) ? kDeviceWindowWidth4Panel:kDeviceWindowHeight;
windowHeight = (!kIsDeviceLandscape) ? kDeviceWindowHeight4Panel:(kDeviceWindowWidth - (IsIOS7orAbove ? 0 : kSystemStatusBarHeight));
}

 其实,本质上可以简述为:iOS8上windowSize取的是当前时刻的windowSize值,因此可以直接赋值;iOS8以下的windowSize取得是下一时刻旋转后的值,相当于预判了

最后一点需要注意的地方是,如果你需要在statusBarOrientationChange方法中手动改变superview的frame,那请把init方法中的autoresizingMask属性全部注释掉,因为两者是冲突的,尤其是在iOS8以下。因为在iOS8以下本质上是在旋转之前就将所有的subviews的布局更新为旋转后的状态了,这样翻转过去就能正常显示。如果你加了autoresizingMask属性,那系统会根据旋转前最后一刻的状态来适配,这样旋转后就群魔乱舞了。

 

 

推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
9asd8fy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有