1.前言
•在iOS程序中,大部分視圖控制器都包含了大量的代碼用於設置UI布局,設置控件的水平或垂直位置,以確保組件在不同版本的iOS中都能得到合理的布局
•甚至有些程序員希望在不同的設備使用相同的視圖控制器,這就給代碼添加了更多的復雜性!
•自動布局AutoLayout的引入很好地解決了這一問題!

2.什么是AutoLayout
•
AutoLayout是一種基於約束的,描述性的布局系統
–基於約束:和以往定義frame的位置和尺寸不同,AutoLayout的位置確定是以所謂相對位置的約束來定義的,比如x坐標為superView的中心,y坐標為屏幕底部上方10像素等
–描述性:約束的定義和各個view的關系使用接近自然語言或者可視化語言的方法來進行描述
–布局系統:用來負責界面的各個元素的位置
•AutoLayout為開發者提供了一種不同於傳統對於UI元素位置指定的布局方法。以前,不論是在IB里拖放,還是在代碼中寫,每個UIView都會有自己的frame屬性,來定義其在當前視圖中的位置和尺寸。而使用AutoLayout,就變為了使用約束條件來定義view的位置和尺寸
3.AutoLayout的優勢
•解決不同分辨率和屏幕尺寸下view的適配問題,同時也簡化了旋轉時view的位置的定義。原來在底部之上10像素居中的view,不論在旋轉屏幕或是更換設備(iPad、iPad mini、iPhone 4或者是iPhone5/iPhone6/iPhone6plus)的時候,始終還在底部之上10像素居中的位置,不會發生變化
•使用約束條件來描述布局,view的frame會依據這些約束來進行計算
4. AutoLayout和Autoresizing Mask的區別
•在iOS6之前,關於屏幕旋轉的適配和iPhone,iPad屏幕的自動適配,基本都是由Autoresizing Mask來完成的。但是隨着大家對iOS App的要求越來越高,以及今后可能出現的多種屏幕和分辨率的設備,Autoresizing Mask顯得有些落伍和遲鈍了。AutoLayout可以完成所有原來Autoresizing Mask能完成的工作,同時還能勝任一些原來無法完成的任務,其中包括:
•AutoLayout可以指定任意兩個view的相對位置,而不需要像Autoresizing Mask那樣需要兩個view在直系的view hierarchy中
•AutoLayout不必須指定相等關系的約束,它可以指定非相等約束(大於或者小於等);而Autoresizing Mask所能做的布局只能是相等條件的
•AutoLayout可以指定約束的優先級,計算frame時將優先按照滿足優先級高的條件進行計算
5. AutoLayout的基本使用
•在創建約束之后,需要將其添加到作用的view上。
在添加時要注意目標view需要遵循以下規則:
•1) 對於兩個同層級view之間的約束關系,添加到他們的父view上
•2) 對於兩個不同層級view之間的約束關系,添加到他們最近的共同父view上
•3) 對於有層次關系的兩個view之間的約束關系,添加到層次較高的父view上
6. 添加和刷新約束 (代碼)
-(void)addConstraint:(NSLayoutConstraint *)constraint
•刷新約束的改變
-setNeedsUpdateConstraints
-layoutIfNeeded
[button setTranslatesAutoresizingMaskIntoConstraints:NO];
// 2.1 水平方向的約束 NSLayoutConstraint *constraintX = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]; [self.view addConstraint:constraintX]; // 2.2 垂直方向的約束 NSLayoutConstraint *constraintY = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]; [self.view addConstraint:constraintY];
6. 使用AutoLayout容易出現的錯誤
•Ambiguous Layout 布局不能確定,即給出的約束條件無法唯一確定一種布局,也就是約束條件不足,無法得到唯一的布局結果。這種情況一般添加一些必要的約束或者調整優先級可以解決
•Unsatisfiable Constraints 無法滿足約束,問題來源是有約束條件互相沖突,因此無法同時滿足,需要刪掉一些約束
•現在使用IB可以比較容易地完成復雜約束,在實際開發中很少再會遇到遺漏或者多余約束情況的出現,有問題的約束條件將直接在IB中得到錯誤或者警告。