一、iOS屏幕適配發(fā)展歷程
設(shè)備 | 適配技術(shù) |
---|---|
4及以前(iPad未出) | 直接用代碼計算 |
有了iPad | autoResizing |
有不同屏幕的iPhone后 | autoLayout |
有更多不同屏幕的iPhone后 | sizeClass |
二因悲、各個技術(shù)的特性
1像吻、 直接用代碼計算
由于屏幕的大小都一樣峻黍,只有橫豎屏的情況,可以直接計算
2拨匆、 autoResizing
適合于控件與其父控件的關(guān)系
各屬性的解釋
屬性 | 解釋 |
---|---|
UIViewAutoresizingNone | 不會隨父視圖的改變而改變 |
UIViewAutoresizingFlexibleLeftMargin | 自動調(diào)整view與父視圖左邊距姆涩,以保證右邊距不變 |
UIViewAutoresizingFlexibleWidth | 自動調(diào)整view的寬度,保證左邊距和右邊距不變 |
UIViewAutoresizingFlexibleRightMargin | 自動調(diào)整view與父視圖右邊距惭每,以保證左邊距不變 |
UIViewAutoresizingFlexibleTopMargin | 自動調(diào)整view與父視圖上邊距骨饿,以保證下邊距不變 |
UIViewAutoresizingFlexibleHeight | 自動調(diào)整view的高度,以保證上邊距和下邊距不變 |
UIViewAutoresizingFlexibleBottomMargin | 自動調(diào)整view與父視圖的下邊距台腥,以保證上邊距不變 |
- view的autoresizesSubviews屬性為yes時(默認(rèn)為yes)宏赘,autoresizing才會生效。
- 從XCODE6開始览爵,Storyboard&Xib默認(rèn)是自動布局置鼻,因此我們需要手動調(diào)整镇饮,才能使用autoresizing蜓竹。
-
autoresizing可以組合使用,如:
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin
3、autoLayout
幫我們確定在不同設(shè)備、不同(父view)環(huán)境下俱济,同一個可視單元所應(yīng)具有合適的位置和尺寸(任何兩個視圖的關(guān)系都可以確定)
1. autoLayout的用法:
- 直接建立約束條件
[self.view addConstraint: [NSLayoutConstraint
constraintWithItem:blueView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:redView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]];
這樣雖然代碼量比較大嘶是,但是是絕對可行的辦法,也是使用autoLayout最根本的辦法之一蛛碌。 - 使用VFL語言
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button=[[UIButton alloc]init];
[button setTitle:@"點(diǎn)擊一下" forState:UIControlStateNormal];
button.translatesAutoresizingMaskIntoConstraints=NO;
[button setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:button];
NSArray *constraints1=[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[button]-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
NSArray *constraints2=[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-20-[button(==30)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
[self.view addConstraints:constraints1];
[self.view addConstraints:constraints2];
} - 使用使用第三方庫聂喇,如:Masonry、UIView+AutoLayout……
2. autoLayout的好處:
- 你基本上可以不用考慮3.5寸和4寸以及即將上市的x.x寸屏幕不同分辨率的問題蔚携,你終于可以不用在viewDidLoad方法里判斷不同分辨率下希太,不同控件應(yīng)該放在哪里,或者針對不同分辨率寫不同的storyboard和xib酝蜒;
- 你可以拋棄那些根據(jù)不同文字來計算tableViewCell誊辉、UILabel高度的代碼了,因?yàn)閍utolayout會幫你自動計算好亡脑;
- 如果你的布局在橫屏豎屏下變化不是特別大,你不用再為橫著豎著寫兩套代碼或者寫兩個storyboard/xib了;
4涩搓、sizeClass
在iOS8中拇派,新增了Size Classes特性,它是對當(dāng)前所有iOS設(shè)備尺寸的一個抽象途戒。那我們就只把屏幕的寬和高分別分成三種情況:Compact:緊湊坑傅、Regular:寬松、Any:任意棺滞。
這樣寬和高三三一整合裁蚁,一共9中情況。如下圖所示继准,針對每一種情況枉证。我們可以在每種情況下設(shè)置不同的布局(包括控件的約束,甚至是控件是否顯示)
** 對sizeClass的理解:**
sizeClass的實(shí)質(zhì)是將iOS屏幕分成了不同的抽象概念移必,這些不同的抽象組合室谚,對應(yīng)著不同的設(shè)備屏幕。所以崔泵,利用sizeClass可以針對同一套UI秒赤,來適配所有的屏幕。注意:這些所有的適配憎瘸,都是利用autoLayout來實(shí)現(xiàn)的入篮,sizeClass只是負(fù)責(zé)提供不同的屏幕尺寸。