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即可