autolayout通過(guò)代碼添加約束的方式有三種:
蘋(píng)果自帶的方式
VFL語(yǔ)言
Masonry框架
蘋(píng)果自帶的方式
- 首先要禁止將autoresizingMask轉(zhuǎn)為對(duì)應(yīng)約束的屬性者疤,因?yàn)樗鼤?huì)自動(dòng)設(shè)置寬度和高度,與autolayout產(chǎn)生沖突
- translatesAutoresizingMaskContrains = NO
- 添加約束(和萬(wàn)能公式有關(guān))
- 例如 【NSLayoutConstraints constraintsWithItem:
紅色view
attribute:寬度
relatedBy:等于
toItem:藍(lán)色view
attribute:寬度
mutiplier:乘以幾
constraints:加上一個(gè)固定的值
】 - 約束方法代碼量大,約束條件不夠會(huì)報(bào)錯(cuò)
- 例如 【NSLayoutConstraints constraintsWithItem:
VFL語(yǔ)言
- Visual Format Language :可視格式化語(yǔ)言
- 需要禁止將autoresizing的設(shè)置轉(zhuǎn)為對(duì)應(yīng)約束的屬性
- 水平方向
- H:[cancleButton(72)-12-[acceptButton(50)]
- cancleButton的寬度是72 ,acceptButton的寬度是50,兩個(gè)控件的水平間距為12
- 垂直方向
- V:[redView(50)]-20-|
- redView的高度是50俊戳,距離右側(cè)父控件的距離是20
- 局限性:有些功能實(shí)現(xiàn)不了陆蟆,需要結(jié)合其他技術(shù)
Masonry
- 通過(guò)代碼添加約束寇窑,一定要禁止掉translatesAutoresizingMaskIntoConstraints 這個(gè)屬性
- 但是缎患,由于框架內(nèi)部已經(jīng)幫我們禁止了這一屬性慕的,我們可以不寫(xiě)代碼
- 調(diào)用:mas_makeConstraints:方法進(jìn)行約束設(shè)置
- make.top.equalTo(self.view.mas_top).multiplied(1.0).offset(20);
- make:誰(shuí)調(diào)用這個(gè)方法,就指誰(shuí)
- multiplied(1.0)可以不寫(xiě)挤渔,默認(rèn)就是乘以1
- equalTo(self.view.mas_top)可以不寫(xiě)肮街,默認(rèn)就是父控件
- mas_equalTo(能把傳入的基本數(shù)據(jù)類(lèi)型包裝成對(duì)象)
- equalTo(不能把傳入的基本數(shù)據(jù)類(lèi)型包裝成對(duì)象,但是導(dǎo)入兩個(gè)宏之后判导,就可以將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)成對(duì)象)
- MAS_SHORTHAND
- MAS_SHORTHAND_GLOBALS
- updateContraints:更新約束
- 特點(diǎn):如果之前有這個(gè)約束會(huì)直接更新嫉父,如果沒(méi)有會(huì)添加新的約束
- remakeConstraints:刪除之前所有的約束,添加新的約束
- Masonry熟練使用后眼刃,會(huì)有一系列簡(jiǎn)寫(xiě)方式
- make.top.and.left.offset(20);
- make.top.left.offset(20);
- make.edges.equalTo(self.view).insets(UIEdgeInsets(20,20,-20,-20,))
- make.edges.insets(UIEdgeInsets(20,20,-20,-20))
補(bǔ)充:
-
添加約束的原則
- 如果是同層級(jí)的關(guān)系绕辖,要添加到父控件上
- 如果不是同層級(jí)關(guān)系,要添加到最近的共同的父控件上去
- 如果是父控件子控件的關(guān)系擂红,要添加到層級(jí)較高的父控件上去
- 控件添加到父控件以后仪际,再設(shè)置約束
-
約束的優(yōu)先級(jí)
- priority
- 優(yōu)先級(jí)越高的約束越先生效