標籤:
自動布局:
1.Autoresizing
當UIView的autoresizesSubviews是YES時,(預設是YES), 那麼在其中的子view會根據它自身的autoresizingMask屬性來自動適應其與superView之間的位置和大小。注意: autoresizing只能設定當前控制項與父控制項之間的相對關係,可以進行螢幕適配
【autoresizingMask是子視圖的左、右、上、下邊距以及寬度和高度相對於父視圖按比例變化,例如:
UIViewAutoresizingNone 不自動調整。
UIViewAutoresizingFlexibleLeftMargin 自動按比例調整與superView左邊的距離,且與superView右邊的距離不變。
UIViewAutoresizingFlexibleRightMargin 自動按比例調整與superView的右邊距離,且與superView左邊的距離不變。
UIViewAutoresizingFlexibleTopMargin 自動按比例調整與superView的頂部距離,且與superView底部的距離不變。
UIViewAutoresizingFlexibleBottomMargin 自動按比例調整與superView的底部距離,且與superView頂部的距離不變。
UIViewAutoresizingFlexibleWidth 自動按比例調整寬度。
UIViewAutoresizingFlexibleHeight 自動按比例調整高度。】
相關demo:UI基礎day10-10自訂布局-代碼-02-用代碼實現autoresizing
2.Autolayout (勾選Use Auto Layout)—>一般需要設定上下左右或上下寬高四個約束,特殊控制項不一定必須4個約束
隨著iPhone發布蘋果裝置不同尺寸的螢幕變得越來越多, 不僅要求能根據控制項父子關係來設定相對位置, 也要求能根據任意控制項之間的關係來設定位置
因為 autoresizing只能設定當期控制項與父控制項之間的相對關係, 當遇到要設定兄弟控制項之間的關係的時候 autoresizing就無能為力了,所以就需要Autolayout通過設定某控制項與任意其他控制項間的關係來決定如何顯示這個控制項, 不僅僅局限與父子控制項
補充:【autolayout:不能滿足設定一套約束,在所有的螢幕都適配,所以出現了sizeclass,size用來區分螢幕
sizeclass沒有寬高:把寬高各分成了三種類型
regualr
compact
any
當寬度和高度各是某種類型的時候,就會確定某一類螢幕
所以確定九類螢幕,只是不螢幕進行了區分,具體的約束關係
還需要autolayout實現】
注意:autoresizing 和autolayout 二者是互斥的,同時只能使用其中一種,當使用autoresizing的時候必須禁用autolayout, 當使用autolayout的時候就無法使用Autoresizing了。
Autolayout當中有倆個核心概念:參照和約束
參照:通過參照其他控制項或父控制項來設定當前控制項的位置和大小
約束Constraint(規則):通過添加約束限制控制項的位置和大小
代碼實現Autolayout的步驟
利用NSLayoutConstraint類建立具體的約束對象
添加約束對象到相應的view上
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray *)constraints;
代碼實現Autolayout的注意點
1》 要先禁止autoresizing功能,設定view的下面屬性為NO
view.translatesAutoresizingMaskIntoConstraints = NO;
2》 添加約束之前,一定要保證相關控制項都已經在各自的父控制項上
3》不用再給view設定frame
瞭解內容,大部分都用SB來設定約束
【一個 《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 :常量
例子:[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:padding.top]
自動布局有個核心公式
obj1.property1 =(obj2.property2 * multiplier)+ constant value
】
架構:Masonry,“一個輕量級的布局架構,採用更"優雅"的文法封裝自動布局”,不需要使用XIB和Storyboard, 並具有高可讀性
方式一逐個設定 make.top.equalTo
方式二連續設定 make.top.left.bottom.and.right.equalTo
方式三一次性設定 make.edges.equalTo
例子:[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
SnapKit:SnapKit是Masonry的Swift版 ,方法和Masonry類似
例子:view1.snp_makeConstraints { (make) -> Void in
make.edges.equalTo(superview).insets(UIEdgeInsetsMake(10, 10, 10, 10))
}這句代碼的意思是view1+UIEdgeInsetsMake(10, 10, 10, 10)的外邊距=superView
//使用架構的步驟
//1.首先匯入標頭檔
//2.在使用架構的地方,匯入主要的.h檔案
//3.使用架構不需要去掉autoresizing
iOS自動布局