UI随设备旋转从iOS6到iOS8的适配策略
来源:互联网 发布:qq飞车天使之翼数据 编辑:程序博客网 时间:2024/05/17 03:32
- (
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属性,那系统会根据旋转前最后一刻的状态来适配,这样旋转后就群魔乱舞了。
- UI随设备旋转从iOS6到iOS8的适配策略
- UI随设备旋转从ios6到ios8的适配
- ios6,7适配旋转
- iOS6到iOS7的适配
- ios6 设备旋转以及获取设备方向
- ios6 设备旋转以及获取设备方向
- ios6设备旋转 以及获取设备方向
- ios6和iphone5的适配<1>之UI适配
- ios6和iphone5的适配之UI适配
- iOS7和iOS6 UI适配的问题
- UIDeviceOrientation 和 UIInterfaceOrientation 设备旋转的用法 (实例) 和 IOS6屏幕旋转详解
- UIInterfaceOrientation 设备旋转的用法 (实例) 和 IOS6屏幕旋转详解
- UI -- IOS6屏幕旋转问题总结
- IOS8 旋转的问题
- IOS8开发视频教程之:基于Swift实战UI从入门到精通
- iOS6 旋转
- 【精】iOS6 及其以上版本自动旋转、手动强制旋转方案及布局适配
- ios6下画面旋转的问题
- 网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp
- Java中 ehcache简单使用实例
- shell从函数文件中调用函数
- openssl主要流程程序代码
- 用java来计算分段函数
- UI随设备旋转从iOS6到iOS8的适配策略
- VS2010下安装boost库
- 编程之美——快速找出机器故障问题
- JAVA并发编程1_多线程的实现方式
- win7搭建网站,设置网站服务启动禁用
- 【git】Git检出某次提交指定版本
- 真正干货:诸葛分享如何真正免费运营推广APP应用?
- C#用DataTable实现Group by数据统计
- MySQL集群技术概述