一、iOS屏幕適配發(fā)展歷程
? ? ? ? ? ? ? ? ? ? ?設(shè)備 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 適配技術(shù)
4 及以前(iPad未出) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 直接用代碼計(jì)算
有了iPad ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? autoResizing
有不同屏幕的 iPhone 之后 ? ? ? ? ? ? ? ? ? ? ? ? autoLayout
有更多不同屏幕的iPhone之后 ? ? ? ? ? ? ? ? ? ? ? sizeClass
二、各個(gè)技術(shù)的特性
1、直接用代碼計(jì)算
由于屏幕的大小都一樣,只有橫豎屏的情況,可以直接計(jì)算
2、autoResizing
適合于控件和其父控件的關(guān)系
、各屬性的解釋
屬性 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?解釋
UIViewAutoresizingNone ? ? ? ? ? ? ? ? ?不會(huì)隨著父試圖的改變而改變
UIViewAutoresizingFlexibleLeftMargin ?自動(dòng)調(diào)整view與父試圖做邊距,以保證右邊距不變
UIViewAutoresizingFlexibleRightMargin ? 自動(dòng)調(diào)整view與父試圖右邊距,以保證做邊距不變
UIViewAutoresizingFlexibleTopMargin ? ? 自動(dòng)調(diào)整view 與父試圖上邊距,以保證下邊距不變
UIViewAutoresizingFlexibleBottomMargin 自動(dòng)調(diào)整view與父試圖下邊距,以保證上邊距不變
UIViewAutoresizingFlexibleWidth ? ? ? ? ? ? ? 自動(dòng)調(diào)整view的寬度,保證左邊距和右邊距不變
UIViewAutoresizingFlexibleHeight ? ? ? ? ? ? ? 自動(dòng)調(diào)整view的高度,保證上邊距和下邊距不變
* view 的 autoresizesSubViews屬性為YES 時(shí)(默認(rèn)為YES),autoresizing才會(huì)有效
* 從Xcode6開始 Storyboard & Xib默認(rèn)是自動(dòng)布局,因此我們需要手動(dòng)調(diào)整才能使用autoresizing?
* auroresizing 可以組合使用,eg: UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleBottonMargin
3、auroLayout
幫我們確定在不同設(shè)備、不同(父view環(huán)境下,同一個(gè)可視單元所應(yīng)具有的合適位置和尺寸(任何兩個(gè)試圖的關(guān)系都可以確定)
*autoLayout 的用法:
? ? ? ? *直接建立約束條件
[self.view addConstraint:[NSLayoutContranit constraintWithItem:blueView ?
arrtibutes:NSLayoutAttributeLeft?
relatedBy:NSLayoutRelationEqual
toItem:redView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]];
這樣雖然代碼量比較大,但是是絕對(duì)可行的辦法,也是使用autoLayout最根本的辦法之一。
*使用VFL語言
- (void) viewDidLoad{
[super viewDidLoad];
UIButton *button = [UIButton alloc] init];
[button setTitle:@"點(diǎn)擊一下“ forState:UIControllStateNormal];
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 *constrains2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[button(==30)];
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
[selfview addConstraints :constraints1];
[self.view addConstraints:constraints2];
*使用第三方庫(kù)如: Masonry、 UIView + AutoLayout ...
*autoLayout的好處
1)、你基本上可不用考慮3.5寸和4寸以及即將上市的x.x寸屏幕不同分辨率的問題,你終于可以不用在viewDidLoad方法里判斷不同分辨率下,不同空間應(yīng)放在哪里,或者針對(duì)不同分辨率寫不同的storyboard和xib;
2)、你可以拋棄那些根據(jù)不同文字來計(jì)算tableView、UILable高度的代碼了,因?yàn)閍utolayout會(huì)幫你自動(dòng)計(jì)算好;
3)、如果你的布局在橫屏豎屏下變化不是特別大,你不用再為橫著豎著寫兩套代碼或者寫兩個(gè)storyboard / xib 了;
4、sizeClass
在iOS8中,新增了Size Classes 特性,它是對(duì)當(dāng)前所有iOS設(shè)備尺寸的一個(gè)抽象。那我們就把屏幕的寬和高分成三種情況: Compact:緊湊、Regular:寬松、Any:任意.
這樣寬和高三三一整合,一共9種情況。如下圖所示,針對(duì)每一種情況。我們可以再每種情況下設(shè)置不同的布局(包括控件的屬性,甚至是空間是否顯示)

對(duì) sizeClass的理解
sizeClass 的實(shí)質(zhì)是將iOS屏幕分成了不同的抽象概念,這些不同的抽象組合,對(duì)應(yīng)著不同的設(shè)備屏幕。所以,利用sizeClass 可以針對(duì)同一套UI,來適配所有的屏幕。之一:這些所有的適配,都是利用autoLayout來實(shí)現(xiàn)的,sizeClass只是負(fù)責(zé)提供不同的屏幕尺寸。