autolayout通過代碼添加約束的方式有三種:
蘋果自帶的方式
VFL語言
Masonry框架
蘋果自帶的方式
- 首先要禁止將autoresizingMask轉為對應約束的屬性,因為它會自動設置寬度和高度,與autolayout產生沖突
- translatesAutoresizingMaskContrains = NO
- 添加約束(和萬能公式有關)
- 例如 【NSLayoutConstraints constraintsWithItem:
紅色view
attribute:寬度
relatedBy:等于
toItem:藍色view
attribute:寬度
mutiplier:乘以幾
constraints:加上一個固定的值
】 - 約束方法代碼量大,約束條件不夠會報錯
- 例如 【NSLayoutConstraints constraintsWithItem:
VFL語言
- Visual Format Language :可視格式化語言
- 需要禁止將autoresizing的設置轉為對應約束的屬性
- 水平方向
- H:[cancleButton(72)-12-[acceptButton(50)]
- cancleButton的寬度是72 ,acceptButton的寬度是50,兩個控件的水平間距為12
- 垂直方向
- V:[redView(50)]-20-|
- redView的高度是50,距離右側父控件的距離是20
- 局限性:有些功能實現不了,需要結合其他技術
Masonry
- 通過代碼添加約束,一定要禁止掉translatesAutoresizingMaskIntoConstraints 這個屬性
- 但是,由于框架內部已經幫我們禁止了這一屬性,我們可以不寫代碼
- 調用:mas_makeConstraints:方法進行約束設置
- make.top.equalTo(self.view.mas_top).multiplied(1.0).offset(20);
- make:誰調用這個方法,就指誰
- multiplied(1.0)可以不寫,默認就是乘以1
- equalTo(self.view.mas_top)可以不寫,默認就是父控件
- mas_equalTo(能把傳入的基本數據類型包裝成對象)
- equalTo(不能把傳入的基本數據類型包裝成對象,但是導入兩個宏之后,就可以將基本數據類型轉成對象)
- MAS_SHORTHAND
- MAS_SHORTHAND_GLOBALS
- updateContraints:更新約束
- 特點:如果之前有這個約束會直接更新,如果沒有會添加新的約束
- remakeConstraints:刪除之前所有的約束,添加新的約束
- Masonry熟練使用后,會有一系列簡寫方式
- 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))
補充:
-
添加約束的原則
- 如果是同層級的關系,要添加到父控件上
- 如果不是同層級關系,要添加到最近的共同的父控件上去
- 如果是父控件子控件的關系,要添加到層級較高的父控件上去
- 控件添加到父控件以后,再設置約束
-
約束的優先級
- priority
- 優先級越高的約束越先生效