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

简介:
1
2
3
4
5
6
- ( void )statusBarOrientationChange:( NSNotification  *)notification
{
     WClassAndFunctionName;
     UIInterfaceOrientation oriention = [UIApplication sharedApplication].statusBarOrientation;
     [ self  adaptUIBaseOnOriention:oriention];
}

 

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

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

开始检测视图旋转。

在init方法中注册通知

1
2
3
4
5
6
7
- ( void )registerListeningDeviceOriention
{
     [[ NSNotificationCenter  defaultCenter] addObserver: self
                                              selector: @selector (statusBarOrientationChange:)
                                                  name:UIApplicationDidChangeStatusBarOrientationNotification
                                                object: nil ];
}

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

1
2
3
4
5
6
- ( 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里面对当前的设备方向以及系统版本进行判断,这样才能取到真正的设备高度跟宽度,真正的设备高度宽度对于布局是至关重要的!

1
2
3
4
5
6
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属性,那系统会根据旋转前最后一刻的状态来适配,这样旋转后就群魔乱舞了。

 本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/p/4236582.html,如需转载请自行联系原作者

相关文章
|
5月前
|
Android开发 iOS开发 UED
探索未来:Android与iOS在智能穿戴设备上的较量
随着科技的飞速进步,智能穿戴设备已经成为我们日常生活中不可或缺的一部分。本文将深入探讨两大操作系统——Android和iOS——在智能穿戴领域的竞争与发展,分析它们各自的优势与挑战,并预测未来的发展趋势。通过比较两者在设计哲学、生态系统、用户体验及创新技术的应用等方面的差异,揭示这场较量对消费者选择和市场格局的影响。 【7月更文挑战第31天】
54 0
|
16天前
|
安全 数据安全/隐私保护 Android开发
探索Android与iOS的隐私保护策略
在数字时代,智能手机已成为我们生活中不可或缺的一部分,而随之而来的则是对个人隐私和数据安全的日益关注。本文将深入探讨Android与iOS两大操作系统在隐私保护方面的策略和实践,分析它们如何应对日益严峻的隐私挑战,以及用户应如何保护自己的数据安全。通过对比分析,我们将揭示两大系统在隐私保护方面的优势和不足,为用户提供有价值的见解和建议。
|
4月前
|
缓存 监控 Android开发
探索iOS与安卓开发中的性能优化策略
在移动应用开发的竞技场上,iOS和安卓这两大操作系统不断推动着技术的边界。性能优化,作为提升用户体验的关键因素,已成为开发者们关注的焦点。本文将深入探讨两大平台上的性能优化实践,揭示如何通过工具、技术和策略来提升应用的响应速度和流畅度,同时考虑到电池寿命和内存管理等关键指标。
|
17天前
|
前端开发 Android开发 开发者
探索Android与iOS的跨平台开发策略
在当今多元化的移动设备市场中,开发者面临着为不同操作系统设计应用的挑战。本文深入探讨了Android和iOS两大主流平台的跨平台开发策略。我们将分析使用Flutter、React Native等框架进行跨平台开发的优劣,并讨论如何克服各平台间的差异性,以实现高效、一致的用户体验。此外,文章还将提供一些实用的技巧和最佳实践,帮助开发者优化跨平台应用的性能和兼容性。
33 4
|
18天前
|
前端开发 Android开发 iOS开发
探索Android与iOS的跨平台开发策略
在移动应用开发的多元化时代,跨平台开发已成为开发者追求效率和广泛覆盖的重要手段。本文深入探讨了Android与iOS两大主流平台下的跨平台开发策略,分析了各自的优势与挑战,并通过实际案例展示了如何有效实施跨平台解决方案,以期为开发者提供有价值的参考和启示。
|
26天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
4月前
|
测试技术 Swift iOS开发
探索iOS自动化测试:使用Swift编写UI测试
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是保证船只不偏离航线的灯塔。本文将带领读者启航,深入探索iOS应用的自动化UI测试。我们将通过Swift语言,点亮代码的灯塔,照亮测试的道路。文章不仅会展示如何搭建测试环境,还会提供实用的代码示例,让理论知识在实践中生根发芽。无论你是新手还是有经验的开发者,这篇文章都将是你技能提升之旅的宝贵指南。
|
4月前
|
安全 Android开发 iOS开发
安卓与iOS开发之道:探索移动应用的差异化策略
【8月更文挑战第21天】在移动应用开发的广阔天地中,安卓和iOS这两大操作系统平台各领风骚。本文将深入探讨这两个平台的差异化策略,帮助开发者理解如何根据不同平台的特性优化应用设计,提升用户体验,并最大化市场潜力。我们将从用户界面、性能优化、市场定位、安全性以及发布策略等多个维度进行比较分析,旨在为开发者提供一个全面的视角,以便在竞争激烈的应用市场中占据一席之地。
|
5月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
4月前
|
运维 网络安全 iOS开发
厉害!外国网络工程师用Ansible给思科IOS设备升级!
厉害!外国网络工程师用Ansible给思科IOS设备升级!