iOS中UI適配相關簡介 – iPhone手機開發技術文章 iPhone軟體開發教學課程

Phone5出來已經很久瞭,因為屏幕尺寸的改變,程序對於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即可

發佈留言