Auto Layout - 使用總結


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM