1、要開始使用AutoLayout,請先設置要約束的view的translatesAutoresizingMaskIntoConstraints屬性為NO。在xib或者sb中勾選Use Auto Layout,那么所有在xib或者sb中出現的view都已經默認將translatesAutoresizingMaskIntoConstraints設置為NO。
self.view.translatesAutoresizingMaskIntoConstraints = NO; // self.view 代表 所有你要添加約束的view
2、在使用AutoLayout布局的view中,代碼中避免出現設置其frame相關屬性(如center)的代碼,但是可以獲取其frame;
3、通過代碼為xib或sb中view增加約束時,盡量避免在viewDidLoad中執行,最好放在updateViewConstraints[UIViewController]或者updateConstraints[UIView]中,記得調用[super updateViewConstraints]或者[super updateConstraints];
- (void)updateViewConstraints { // 在這里為你的view添加約束,請確保該view的translatesAutoresizingMaskIntoConstraints屬性已設置為NO [super updateViewConstraints]; }
如果你真的寫在viewDidLoad里了,那么可能會遇到這種崩潰錯誤
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Impossible to set up layout with view hierarchy unprepared for constraint.'
4、設置UIScrollView內部的子控件相對於UIScrollView的約束時,該約束只會影響UIScrollView的contentsize計算,並不會影響UIScrollView的size。
按照下圖中的視圖結構為UIScrollView添加container,然后將所有的子控件添加到container中
① 設置scroll view相對於其父控件的約束 - 保證scrollview的正確位置和大小
② 設置container相對於scroll view的約束 - 一般情況下為container距離scrollview的trailing/leading/top/bottom均為0。這樣scrollview會通過該約束和container的大小來計算contentsize
③ 向container中添加子控件,並約束container的寬度和高度適應子控件
如果想設置container為固定寬度且與控制器view的寬度相等,在這種情況下可以使用代碼進行設置container相對於self.view的leading/trailing為0。
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 }
5、在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,然后依次添加約束要簡單快捷許多,而且在數量較少的情況下對性能幾乎沒有影響。
6、如果需要在控制器中動態添加或者移除視圖,在控制器中為新添加的視圖增加約束,在updateViewConstrains中實現,然后調用[super updateViewConstrains];同理,在view中動態添加或者移除視圖,在updateConstrains中實現,然后調用[super updateConstrains]
7、控制器在其view需要重新布局時會執行以下過程:
① 控制器的視圖調整到新的尺寸 - 控制器會根據當前狀態欄、導航條等其它因素的狀態來調整其view的位置尺寸
② 如果沒有使用autolayout,所有子視圖會根據autoresizeing mask調整
③ 調用viewWillLayoutSubviews
④ 調用控制器視圖的layoutSubviews,如果是使用autolayout,則會調用updateViewConstrains -> 該方法的實現會調用所有子視圖的updateConstraints -> 更新完約束之后,所有視圖會根據計算出來的新的布局更新位置
⑤ 調用控制器的viewDidLayoutSubviews
如對以上內容有疑問,歡迎留言討論。轉載請注明出處:博客園 @bbqe http://www.cnblogs.com/liufeng24/