引言:php
Auto Layout是iOS6發佈後引入的一個全新的佈局特性,其目的是彌補以往autoresizing在佈局方面的不足之處,以及將來面對更多尺寸適配時界面佈局能夠更好的適應.
要徹底掌握Auto Layout是一件很是消耗精力的事情,須要大量的實踐,而且在根本上面,理解其如何使用,若是要全面的介紹Auto Layout和使用場景估計幾篇博文都介紹不完,
本文但願能將使用Auto Layout的重點和技巧以及注意事項,進行一個介紹.成爲學習Auto Layout的一個導航文章.html
參考資料:ios
1:iOS7.0 Xcode5 Auto Layout 備忘錄git
http://www.cnblogs.com/thefeelingofsimple/p/3316300.html
github
2:iOS 6 Auto Layout NSLayoutConstraint 界面佈局web
3:iOS 6 新特性 Auto Layoutapp
http://www.cocoachina.com/bbs/read.php?tid=116558
工具
4:WWDC 2012 Session筆記——202, 228, 232 AutoLayout(自動佈局)入門佈局
http://onevcat.com/2012/09/autoayout/
5:iOS 6 自動佈局 入門-1
6:先進的自動佈局工具箱
使用:
1:理解概念
Auto Layout中文翻譯過來意思是自動佈局,經過內定的Constraint(約束)和各項條件來計算出合理的佈局.而這個合理的佈局,符合咱們的的預期和意圖.
將咱們想象中的結果展示出來.Constraint的設定很是靈活,實現一種佈局的方法能夠經過多Constraint套來完成.
如下幾點是咱們在開始使用以前必須弄清楚的事情:
1:咱們要拋棄以往舊的佈局方式再也不去關注View的Frame,Center,和autoresizing. 由於這些座標和大小的定位均可以經過來Auto Layout完成.
2:理解每一種Constraint的含義,不然,當你去看別人的實現的Constraint時,就會有種看天書的感受.
3:按意圖設計,一切按咱們理想中的效果去佈局,只要約束設定的合理,就必定可以完成目標佈局.
2:開始使用
先從Interface Builder開始吧. 打開某個Xib或者StoryBoard,
在右側Show in file inspector裏面找到Ues Autolayout,將其勾選.以下圖:
自此,Autolayout便啓用成功,autoresizingMask被廢棄.其全部以往的功能和特性都被Autolayout取代.
如今咱們定位控件位置的方式,再也不像之前同樣,計算好每個控件具體的位置,x是多少,y是多少.
而是思考,這個控件離左邊是相隔多少距離,或者離頂部或底部相隔多少距離.
而有些規則性的事情仍是相似的,好比咱們定位一個控制的位置,必定要有x,y兩個座標點同時有值,少一個都不能正常顯示.
一樣Autolayout在建立約束時也同樣,在思考完離頂部距離之後,還須要思考離頂部距離,不然控件的顯示位置同樣沒法正常顯示.
換言之,要讓Autolayout計算出合理的位置,須要保證水平距離和垂直距離同時存在. 不然IDE,都會給出警告,提示這樣的佈局Ambiguous Layout(模凌兩可)
接下來,讓咱們來熟悉一下Interface Builder提供哪些實現Autolayout的功能:
觀察一下界面預覽右下角,有一排以下圖這樣的按鈕:
這些是Interface Builder用來建立Constraint的主要方式,同時,咱們也能夠在Xcode的菜單欄中找到這些功能,以下圖:
這些功能分別以下圖中描述的那樣:
若是是從代碼層面開始使用Autolayout,須要對使用的View的translatesAutoresizingMaskIntoConstraints的屬性設置爲NO.
便可開始經過代碼添加Constraint,不然View仍是會按照以往的autoresizingMask進行計算.
而在Interface Builder中勾選了Ues Autolayout,IB生成的控件的translatesAutoresizingMaskIntoConstraints屬性都會被默認設置NO.
3:從舊的IB佈局中轉換成Auto layout
4:熟練使用Interface Builder
5:經過代碼來構建自動佈局
代碼建立的約束有兩種方式:
1:常規約束,寫法很是冗長,但能實現全部的約束方式以及很是特殊的約束方式,代碼以下:
[csharp] view plain copy
//實例化Button
button1 = [[UIButton alloc] initWithFrame:(CGRectZero)];//這裏再也不須要去刻意指定x.y等座標.
[button1 setTitle:@"yushuyi" forState:UIControlStateNormal];
[button1 setBackgroundColor:[UIColor redColor]];
[button1 sizeToFit];
[button1 setTranslatesAutoresizingMaskIntoConstraints:NO];//將使用AutoLayout的方式來佈局
[self.view addSubview:button1];
//建立了一個水平居中父視圖的約束
NSLayoutConstraint *constraint = [
NSLayoutConstraint
constraintWithItem:button1
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:1.0f
constant:00.0f
];
[self.view addConstraint:constraint];//將約束添加到對應的父視圖中
//繼續建立了一個位於父視圖底部相隔20距離的約束
constraint = [
NSLayoutConstraint
constraintWithItem:button1
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1.0f
constant:-20.0f
];
[self.view addConstraint:constraint];
值得注意的是,添加約束以前必定要將子視圖優先 addSubview 到父視圖中,不然在添加約束時會產生編譯器警告.
而咱們在理解的時候,能夠經過這種方式來理解.
item1.attribute = multiplier ⨉ item2.attribute + constant
2:可視化格式語言約束
所謂可視化格式語言約束,是一種很直觀的理解方式,固然,前提是你已經熟練理解這套語言的規則.
經過可視化語言能夠一次性建立多個約束. 這對於第一次方式來講,是至關方面和容易理解的.但可視化語言不是全部約束都能知足.
咱們能夠用正則表達式的學習方式來學習這項可視化格式語言.舉例代碼以下:
[csharp] view plain copy
//建立須要參與約束規則的對象字典 <span style="font-family:Arial,Helvetica,sans-serif">表示這三個Button將參與Autolayout的約束處理</span>
NSDictionary *viewsDic = NSDictionaryOfVariableBindings(deleteButton,cancelButton,nextButton);
NSArray *constraints = nil;
constraints = [NSLayoutConstraint constraintsWithVisualFormat:
@"H:|-25-[deleteButton(==cancelButton@700)]-(>=8)-[cancelButton(140)]-[nextButton(nextButtonWidth)]-rectY-|"//水平 可視化格式語言
options:NSLayoutFormatAlignAllTop //對齊功能
metrics:@{@"rectY":@5,@"nextButtonWidth":@30}//指標參數
views:viewsDic];//參與約束的對象字典
[self.view addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:
@"V:[nextButton]-|" //垂直 可視化格式語言
options:0 //無條件
metrics:nil//不帶指標參數
views:viewsDic];//參與約束的對象字典
[self.view addConstraints:constraints];
// [deleteButton setContentHuggingPriority:249 forAxis:UILayoutConstraintAxisHorizontal];
這簡單的十行代碼,若是你沒有學習過Autolayout也會看出一些貓膩,彷佛看懂了.但又似懂非懂.接下來就詳細解釋一下
在解釋以前,先看看上面這些代碼執行後的效果,豎屏以下圖:
橫屏:
三個按鈕位於視圖的底部,有大有小,中間有間隔.
3:經過第三方Auto Layout的加強類別包,來實現約束的建立
https://github.com/smileyborg/UIView-AutoLayout
UIView-AutoLayout的出現如做者所說,其實現思路來源於Interface Builder. 因此在其API命名方面能夠找到不少Interface Builder的影子,
博主極力推薦這個類庫,經過它來建立約束是一件很是愉快的事情,思路清晰,當有個前提是,你已經理解了Auto Layout各項規則.
constraintsAffectingLayoutForAxis //約束檢查 爲何這個View 這樣顯示
6:調試:
看懂IB給出的警告:
經過代碼來檢測 模凌兩可的佈局:
總結: