項目要作iPhone版和iPad的適配,就找了一些資料 關於iOS的自動佈局,學習的一些收穫以及心得給你們分享一下。
xib的佈局就不說了,就是線的鏈接,主要分享一下純代碼的一些自動佈局的學習心得。
Autolayout的強大是毋庸質疑的,當你熟悉了它以後,你確定會以爲它很方便的實現佈局,佈局將會比使用frame的絕對座標時還方便。
UIView *superview = self;
UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO; view1.backgroundColor = [UIColor greenColor]; [superview addSubview:view1]; UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10); [superview addConstraints:@[ //view1 constraints [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeTop multiplier:1.0 constant:padding.top], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:padding.left], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-padding.bottom], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeRight multiplier:1 constant:-padding.right], ]];
最初,我在許多地方看到佈局的時候,關於這句話一直不太理解 UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);以後找了一些資料,UIEdgeInsets 是控件的屬性,由函數 UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right ); 構造出,分別表示其中的內容/標題/圖片離各邊的距離。
這只是其中一種寫法,如下還有一個例子來說解一下:
UIView *redView = [[UIView alloc] init];git
redView.backgroundColor = [UIColor redColor];github
[self.view addSubview:redView];ide
[redView setTranslatesAutoresizingMaskIntoConstraints:NO]; //標明將使用autolayout方式來佈局函數
NSMutableArray *tmpConstraints = [NSMutableArray array];佈局
constraintsWithVisualFormat:參數爲NSString型,指定Contsraint的屬性,是垂直方向的限定仍是水平方向的限定,參數定義通常以下:
V:|-(>=XXX) :表示垂直方向上相對於SuperView大於、等於、小於某個距離;學習
如果要定義水平方向,則將V:改爲H:便可; 在接着後面-[]中括號裏面對當前的View/控件 的高度/寬度進行設定;spa
options:字典類型的值;這裏的值通常在系統定義的一個enum裏面選取orm
metrics:nil;通常爲nil ,參數類型爲NSDictionary,從外部傳入 //衡量標準
views:就是上面所加入到NSDictionary中的綁定的View圖片
在這裏要注意的是 AddConstraints 和 AddConstraint 之間的區別,一個添加的參數是NSArray,一個是NSLayoutConstraintip
使用規則:
|: 表示父視圖
-: 表示距離
V: :表示垂直
H: :表示水平
>= :表示視圖間距、寬度和高度必須大於或等於某個值
<= :表示視圖間距、寬度和高度必須小宇或等於某個值
== :表示視圖間距、寬度或者高度必須等於某個值
@ :>=、<=、== 限制 最大爲 1000
具體事例:
1.|-[view]-|: 視圖處在父視圖的左右邊緣內
2.|-[view] : 視圖處在父視圖的左邊緣
3.|[view] : 視圖和父視圖左邊對齊
4.-[view]- : 設置視圖的寬度高度
5.|-30.0-[view]-30.0-|: 表示離父視圖 左右間距 30
6.[view(200.0)] : 表示視圖寬度爲 200.0
7.|-[view(view1)]-[view1]-| :表示視圖寬度同樣,而且在父視圖左右邊緣內
8. V:|-[view(50.0)] : 視圖高度爲 50
9: V:|-(==padding)-[imageView]->=0-[button]-(==padding)-| : 表示離父視圖的距離爲Padding,這兩個視圖間距必須大於或等於0而且距離底部父視圖爲 padding。
10: [wideView(>=60@700)] :視圖的寬度爲至少爲60 不能超過 700 ,最大爲1000
例子:
NSArray *array0 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-50-[redView(>=100)]" options:1 metrics:nil views:NSDictionaryOfVariableBindings(redView)];
[tmpConstraints addObjectsFromArray:array0];
NSArray *array1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[redView(==150)]" options:1 metrics:nil views:NSDictionaryOfVariableBindings(redView)];
[tmpConstraints addObjectsFromArray:array1];
[self.view addConstraints:tmpConstraints];
greenView = [[UIView alloc] init];
greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:greenView];
[greenView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSMutableArray *tmpConstrains = [NSMutableArray array];
[tmpConstrains addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView]-[greenView(>=100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView,greenView)]];
[tmpConstrains addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[greenView(==150)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(greenView)]];
[self.view addConstraints:tmpConstrains];
[self setTopLayout:[array1 objectAtIndex:0]];
[self setLeftLayout:[array0 objectAtIndex:1]];
固然這種寫的比較繁瑣,也比較耗時,以後發現了一個第三方庫,會使得自動佈局變的簡單 ,https://github.com/SnapKit/Masonry,具體使用就不詳解了,裏面有例子介紹。