Auto Layout - 使用總結

一、要開始使用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的sizecode

按照下圖中的視圖結構爲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/

相關文章
相關標籤/搜索