iPhone5出来已经很久了,因为屏幕尺寸的改变,程序对于UI的灵活操控就显的尤为重要
其实这次的总结还是用的老API中相关的属性,只不过以前我们没有深入的考虑,或者说是我没有深入考虑吧
先从viewController的view说起吧(以下代码全部为ARC环境下)手动创建view都是从loadView方法中初始化viewController的self.view,这里说API中的属性:
1、[UIScreen mainScreen].bounds,屏幕的bounds,
2、[UIScreen mainScreen].applicationFrame,app的frame,当app的statusBar隐藏时,它跟[UIScreen mainScreen].bounds实际是一样的
我一般这么创建view:self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
此时view的frame在iPhone5是0,20,320,548,之前的iPhone是0,20,320,460,
之后viewController的self.view的frame会自动在viewWillAppear方法中重新变化,自动适配屏幕的尺寸,也就是说,如果你有navigationBar,那么此时view的frame是0,20,320,504(iPhone5),我在以前都是手动在loadView的时候减44的,不知道有没有跟我一样的。。。
好了,说了这么多,一句话总结就是,你controller的self.view会在viewWillAppear把自己的frame设置为除了statusBar和navigationBar,充满屏幕的尺寸,如果没有了statusBar和navigationBar或者它们之一,self.view的frame依然是充满屏幕的
下面就是UIView的一个适配上很重要的属性了:autoresizingMask,它的作用是,superView的frame变化后,它在superView中的位置或大小如何变化,它的属性如下:
enum {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;
举个例子,假如你的背景中有个button,你希望这个button无论什么时候,距离这个背景底部的高度都是固定的,那你只需要设置button的autoresizingMask为UIViewAutoresizingFlexibleTopMargin。
让我们来看一下UIViewAutoresizingFlexibleTopMargin的定义:The view resizes by expanding or shrinking in the direction of the top margin.就是说它在superview中,距离顶部的位置是可变的
如果同时设置UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin,那么它在superview中的新位置(这里的新位置,指的是superView的frame变化后的位置)会是旧位置乘以一个比例因数得出。
比例因数为:superView当前高度 - 它的高度 / superView原高度 - 它的高度
有了这两个知识点,就可以轻松适配iPhone5和之前的屏幕了,比如某个特定viewB中有个元素A,你希望A无论在iPhone5还是4s都是在B中距离B的底部20px,那你只需要设置它的autoresizingMask为UIViewAutoresizingFlexibleTopMargin,并且在controller的viewWillAppear设置一下B的新frame即可