AutoLayout
autolayout的概念
Autolayout是一種“自動(dòng)布局”技術(shù)混移,專門用來布局UI界面的 Autolayout自iOS 6開始引入,由于Xcode 4的不給力埃仪,當(dāng)時(shí)并沒有得到很大推廣 自iOS 7(Xcode 5)開始,Autolayout的開發(fā)效率得到很大的提升 蘋果官方也推薦開發(fā)者盡量使用Autolayout來布局UI界面 Autolayout能很輕松地解決屏幕適配的問題
![](http://localhost:44244/raw/_/L1VzZXJzL2tlbnpoYW8vR2l0Qm9vay9MaWJyYXJ5L0ltcG9ydC91aWJhc2lj/master/Snip20150908_9.png?token=Y3FsZWU6ZWVmMDFkMmQtZjAyZC00Y2JiLThkNjctNmZjMjYyMTI4MGUz)
![](http://localhost:44244/raw/_/L1VzZXJzL2tlbnpoYW8vR2l0Qm9vay9MaWJyYXJ5L0ltcG9ydC91aWJhc2lj/master/Snip20150908_8.png?token=Y3FsZWU6ZWVmMDFkMmQtZjAyZC00Y2JiLThkNjctNmZjMjYyMTI4MGUz)
![](http://localhost:44244/raw/_/L1VzZXJzL2tlbnpoYW8vR2l0Qm9vay9MaWJyYXJ5L0ltcG9ydC91aWJhc2lj/master/Snip20150908_10.png?token=Y3FsZWU6ZWVmMDFkMmQtZjAyZC00Y2JiLThkNjctNmZjMjYyMTI4MGUz)
autolayout的錯(cuò)誤和警告
警告
控件的frame不匹配所添加的約束, 比如 比如約束控件的寬度為100, 而控件現(xiàn)在的寬度是110
錯(cuò)誤
缺乏必要的約束, 比如只約束了寬度和高度, 沒有約束具體的位置
兩個(gè)約束沖突, 比如,1個(gè)約束控件的寬度為100,1個(gè)約束控件的寬度為110
代碼實(shí)現(xiàn)autolayout
代碼實(shí)現(xiàn)Autolayout的步驟
利用NSLayoutConstraint類創(chuàng)建具體的約束對(duì)象 添加約束對(duì)象到相應(yīng)的view上
-(void)addConstraint:(NSLayoutConstraint *)constraint;-(void)addConstraints:(NSArray *)constraints;
代碼實(shí)現(xiàn)Autolayout的注意點(diǎn)
要先禁止autoresizing功能陕赃,設(shè)置view的下面屬性為NO
view.translatesAutoresizingMaskIntoConstraints = NO;
添加約束之前卵蛉,一定要保證相關(guān)控件都已經(jīng)在各自的父控件上 不用再給view設(shè)置frame
一個(gè)NSLayoutConstraint對(duì)象就代表一個(gè)約束
創(chuàng)建約束對(duì)象的常用方法
+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;view1 :要約束的控件attr1 :約束的類型(做怎樣的約束)relation :與參照控件之間的關(guān)系view2 :參照的控件attr2 :約束的類型(做怎樣的約束)multiplier :乘數(shù)c :常量
自動(dòng)布局的核心計(jì)算公式 obj1.property1 =(obj2.property2 * multiplier)+ constant value
在創(chuàng)建約束之后,需要將其添加到作用的view上
在添加時(shí)要注意目標(biāo)view需要遵循以下規(guī)則:
1)對(duì)于兩個(gè)同層級(jí)view之間的約束關(guān)系么库,添加到它們的父view上
2)對(duì)于兩個(gè)不同層級(jí)view之間的約束關(guān)系傻丝,添加到他們最近的共同父view上
3)對(duì)于有層次關(guān)系的兩個(gè)view之間的約束關(guān)系,添加到層次較高的父view上
VFL
VFL全稱是Visual Format Language诉儒,翻譯過來是“可視化格式語言”
VFL是蘋果公司為了簡化Autolayout的編碼而推出的抽象語言
![](http://localhost:44244/raw/_/L1VzZXJzL2tlbnpoYW8vR2l0Qm9vay9MaWJyYXJ5L0ltcG9ydC91aWJhc2lj/master/Snip20150908_11.png?token=Y3FsZWU6ZWVmMDFkMmQtZjAyZC00Y2JiLThkNjctNmZjMjYyMTI4MGUz)
VFL示例
-H:[cancelButton(72)]-12-[acceptButton(50)]canelButton寬72葡缰,acceptButton寬50,它們之間間距12H:[wideView(>=60@700)]wideView寬度大于等于60point,該約束條件優(yōu)先級(jí)為700(優(yōu)先級(jí)最大值為1000泛释,優(yōu)先級(jí)越高的約束越先被滿足)
V:[redBox][yellowBox(==redBox)]豎直方向上滤愕,先有一個(gè)redBox,其下方緊接一個(gè)高度等于redBox高度的yellowBoxH:|-10-[Find]-[FindNext]-[FindField(>=20)]-|水平方向上胁澳,F(xiàn)ind距離父view左邊緣默認(rèn)間隔寬度该互,之后是FindNext距離Find間隔默認(rèn)寬度;再之后是寬度不小于20的FindField韭畸,它和FindNext以及父view右邊緣的間距都是默認(rèn)寬度宇智。(豎線“|” 表示superview的邊緣)
VFL使用
使用VFL來創(chuàng)建約束數(shù)組+ (NSArray*)constraintsWithVisualFormat:(NSString*)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary*)metrics views:(NSDictionary*)views;format :VFL語句opts :約束類型metrics :VFL語句中用到的具體數(shù)值views :VFL語句中用到的控件創(chuàng)建一個(gè)字典(內(nèi)部包含VFL語句中用到的控件)的快捷宏定義NSDictionaryOfVariableBindings(...)
第三方框架Masonry
一般在調(diào)用方法前有Mas_的前綴,要省略必須在導(dǎo)入頭文件前使用以下的宏定義
#define MAS_SHORTHAND
#define MAS_SHORTHAND_GLOBALS
示例
[iconImageView makeConstraints:^(MASConstraintMaker *make) {? ? ? ? ? make.left.top.equalTo(self.contentView).offset(margin);? ? ? make.bottom.equalTo(self.contentView).offset(-margin);? ? ? make.width.equalTo(80);? }];
示例
第一條約束表示控件距離contentView上和左的間距為margin
第二條表示距離底部間距為margin
第三條表示寬度為80;