一、要開始使用AutoLayout,請先設置要約束的view的translatesAutoresizingMaskIntoConstraints屬性爲NO。在xib或者sb中勾選Use Auto Layout,那麼全部在xib或者sb中出現的view都已經默認將translatesAutoresizingMaskIntoConstraints設置爲NO。app
self.view.translatesAutoresizingMaskIntoConstraints = NO; // self.view 表明 全部你要添加約束的view
二、在使用AutoLayout佈局的view中,代碼中避免出現設置其frame相關屬性(如center)的代碼,可是能夠獲取其frame;佈局
三、經過代碼爲xib或sb中view增長約束時,儘可能避免在viewDidLoad中執行,最好放在updateViewConstraints[UIViewController]或者updateConstraints[UIView]中,記得調用[super updateViewConstraints]或者[super updateConstraints];性能
- (void)updateViewConstraints { // 在這裏爲你的view添加約束,請確保該view的translatesAutoresizingMaskIntoConstraints屬性已設置爲NO [super updateViewConstraints]; }
若是你真的寫在viewDidLoad裏了,那麼可能會遇到這種崩潰錯誤spa
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Impossible to set up layout with view hierarchy unprepared for constraint.'
四、設置UIScrollView內部的子控件相對於UIScrollView的約束時,該約束只會影響UIScrollView的contentsize計算,並不會影響UIScrollView的size。code
按照下圖中的視圖結構爲UIScrollView添加container,而後將全部的子控件添加到container中blog
① 設置scroll view相對於其父控件的約束 - 保證scrollview的正確位置和大小ip
② 設置container相對於scroll view的約束 - 通常狀況下爲container距離scrollview的trailing/leading/top/bottom均爲0。這樣scrollview會經過該約束和container的大小來計算contentsize博客
③ 向container中添加子控件,並約束container的寬度和高度適應子控件it
若是想設置container爲固定寬度且與控制器view的寬度相等,在這種狀況下可使用代碼進行設置container相對於self.view的leading/trailing爲0。io
1 - (void)updateViewConstraints 2 { 3 NSLayoutConstraint *sctLeading = [NSLayoutConstraint constraintWithItem:_container attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0]; 4 NSLayoutConstraint *cstTrailing = [NSLayoutConstraint constraintWithItem:_container attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:0]; 5 6 [self.view addConstraints:@[cstTrailing, sctLeading]]; 7 8 [super updateViewConstraints]; 9 }
五、在AutoLayout中設置固定數量view等間距分佈的簡單方法
以水平方向爲例,依次添加視圖[space 表示 用透明視圖佔據間隙位置]
space1-view1-space2-view2-space3-view3-space4
設置space leading = super.leading + 0 / space4.trailing = super.trailing + 0 4個space等寬,高度可隨意設置[但不能不設置] 全部view寬度相同便可。
該方式比普通的直接拖3個view,而後依次添加約束要簡單快捷許多,並且在數量較少的狀況下對性能幾乎沒有影響。
六、若是須要在控制器中動態添加或者移除視圖,在控制器中爲新添加的視圖增長約束,在updateViewConstrains中實現,而後調用[super updateViewConstrains];同理,在view中動態添加或者移除視圖,在updateConstrains中實現,而後調用[super updateConstrains]
七、控制器在其view須要從新佈局時會執行如下過程:
① 控制器的視圖調整到新的尺寸 - 控制器會根據當前狀態欄、導航條等其它因素的狀態來調整其view的位置尺寸
② 若是沒有使用autolayout,全部子視圖會根據autoresizeing mask調整
③ 調用viewWillLayoutSubviews
④ 調用控制器視圖的layoutSubviews,若是是使用autolayout,則會調用updateViewConstrains -> 該方法的實現會調用全部子視圖的updateConstraints -> 更新完約束以後,全部視圖會根據計算出來的新的佈局更新位置
⑤ 調用控制器的viewDidLayoutSubviews
如對以上內容有疑問,歡迎留言討論。轉載請註明出處:博客園 @bbqe http://www.cnblogs.com/liufeng24/