在Autolayout之前,Autoresizing可以作屏幕適配,但局限性較大有些任務根本無法完成
相比之下,Autol'ayout的功能比Autoresizing強大很多
什么是Autolayout
1.Autolayout是一種“自動布局”技術,專門用來布局UI界面的
2.Autolayout自iOS 6開始引入,由于Xcode 4的不給力,當時并沒有得到很大推廣
3.自iOS 7(Xcode 5)開始,Autolayout的開發效率得到很大的提升
4.蘋果官方也推薦開發者盡量使用Autolayout來布局UI界面
5.Autolayout能很輕松地解決屏幕適配的問題
Autolayout的2個核心概念
1. 參照
2. 約束
Autolayout常用面板
01-約束處理
Snip20150821_36.png
02-相對
Snip20150821_37.png
03-對齊
Snip20150821_38.png
Autolayout的警告和錯誤
- 警告:
控件的frame不匹配所添加的約束,
比如約束控件的寬度為100, 而控件現在的寬度是110
如下圖所示:
Snip20150821_40.png
- 錯誤:
缺乏必要的約束,
比如只約束了寬度和高度, 沒有約束具體的位置
如下圖所示:
Snip20150821_39.png
- 兩個約束沖突,:
比如1個約束控件的寬度為100, 1個約束控件的寬度為110
如下圖所示:
Snip20150821_39.png
通過代碼添加Autolayout
但首先需要先了解一個類(NSLayoutConstraint)
一個NSLayoutConstraint對象就代表一個約束
創建約束對象的常用方法
+ (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 :與參照控件之間的關系
view2 :參照的控件
attr2 :約束的類型(做怎樣的約束)
multiplier :乘數
c :常量
- 自動布局的核心計算公式
obj1.property1 =(obj2.property2 * multiplier)+ constant value
代碼實現Autolayout的步驟
- 利用NSLayoutConstraint類創建具體的約束對象
- 添加約束對象到相應的view上
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray *)constraints;
代碼實現Autolayout的注意點
- 要先禁止autoresizing功能,設置view的下面屬性為NO
view.translatesAutoresizingMaskIntoConstraints = NO;
- 添加約束之前,一定要保證相關控件都已經在各自的父控件上不用再給view設置frame
添加約束的規則
在創建約束之后,需要將其添加到作用的view上
在添加時要注意目標view需要遵循以下規則:
1)對于兩個同層級view之間的約束關系,添加到它們的父view上
2)對于兩個不同層級view之間的約束關系,添加到他們最近的共同父view上
3)對于有層次關系的兩個view之間的約束關系,添加到層次較高的父view上