在Autolayout之前朴沿,Autoresizing可以作屏幕適配,但局限性較大有些任務(wù)根本無法完成
相比之下授艰,Autol'ayout的功能比Autoresizing強(qiáng)大很多
什么是Autolayout
1.Autolayout是一種“自動(dòng)布局”技術(shù)辨嗽,專門用來布局UI界面的
2.Autolayout自iOS 6開始引入,由于Xcode 4的不給力想诅,當(dāng)時(shí)并沒有得到很大推廣
3.自iOS 7(Xcode 5)開始召庞,Autolayout的開發(fā)效率得到很大的提升
4.蘋果官方也推薦開發(fā)者盡量使用Autolayout來布局UI界面
5.Autolayout能很輕松地解決屏幕適配的問題
Autolayout的2個(gè)核心概念
1. 參照
2. 約束
Autolayout常用面板
01-約束處理
Snip20150821_36.png
02-相對
Snip20150821_37.png
03-對齊
Snip20150821_38.png
Autolayout的警告和錯(cuò)誤
- 警告:
控件的frame不匹配所添加的約束,
比如約束控件的寬度為100, 而控件現(xiàn)在的寬度是110
如下圖所示:
Snip20150821_40.png
- 錯(cuò)誤:
缺乏必要的約束,
比如只約束了寬度和高度, 沒有約束具體的位置
如下圖所示:
Snip20150821_39.png
- 兩個(gè)約束沖突,:
比如1個(gè)約束控件的寬度為100, 1個(gè)約束控件的寬度為110
如下圖所示:
Snip20150821_39.png
通過代碼添加Autolayout
但首先需要先了解一個(gè)類(NSLayoutConstraint)
一個(gè)NSLayoutConstraint對象就代表一個(gè)約束
創(chuàng)建約束對象的常用方法
+ (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
代碼實(shí)現(xiàn)Autolayout的步驟
- 利用NSLayoutConstraint類創(chuàng)建具體的約束對象
- 添加約束對象到相應(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
添加約束的規(guī)則
在創(chuàng)建約束之后,需要將其添加到作用的view上
在添加時(shí)要注意目標(biāo)view需要遵循以下規(guī)則:
1)對于兩個(gè)同層級view之間的約束關(guān)系忘古,添加到它們的父view上
2)對于兩個(gè)不同層級view之間的約束關(guān)系徘禁,添加到他們最近的共同父view上
3)對于有層次關(guān)系的兩個(gè)view之間的約束關(guān)系,添加到層次較高的父view上