??對于使用自動布局首先要注意以下幾點(diǎn):
- 不要使用frame布局,這樣可以盡量減少約束沖突亏娜。
- 一定要在設(shè)置約束之前先把視圖添加到父視圖之上。
- 設(shè)置不允許將AutoresizingMask轉(zhuǎn)化成AutoLayout
view.translatesAutoresizingMaskIntoConstraints = NO;
添加約束的規(guī)則:
-
兩個同層級的View之間添加約束關(guān)系蹬挺,要添加到他們的父類上维贺。
-
不同層級的View之間添加約束關(guān)系,要添加在他們最近的共同父控件上巴帮。
-
對于有層次關(guān)系的兩個view之間的約束關(guān)系溯泣,添加到層次較高的父view上。
使用NSLayoutConstraint進(jìn)行布局榕茧,例如如下代碼垃沦,其余的形式也都是一樣。
第一個參數(shù)view是需要添加約束的控件
第二個參數(shù)NSLayoutAttributeWidth是需要約束的部分
第三個參數(shù)NSLayoutRelationEqual比較的方式用押,就是相對其他控件肢簿,該控件是大于,小于還是等于。
第四個參數(shù)nil 表示相對那個控件池充,如果是相對自身就設(shè)置nil桩引。
第五個參數(shù)NSLayoutAttributeNotAnAttribute相對其他控件的的哪里進(jìn)行布局。
第六個參數(shù)0 表示相對其他控件需要乘以多少收夸。
第七個參數(shù)常量值 表示相對其他控件布局的常量值阐污。
//設(shè)置控件的寬度等于300
NSLayoutConstraint * constr = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:300];
[view addConstraint:constr];
//設(shè)置高度
NSLayoutConstraint * constr1 = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:70];
[view addConstraint:constr1];
//設(shè)置位置約束
NSLayoutConstraint *constRight = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:-10];
[self.view addConstraint:constRight];
NSLayoutConstraint *constBottom = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-10];
[self.view addConstraint:constBottom];
使用VFL進(jìn)行自動布局
- ??VFL相對NSLayoutConstraint是顯的相對簡便些,但是VFL不是所有的都能進(jìn)行布局咱圆,有些情況下,還是需要NSLayoutConstraint來進(jìn)行布局的功氨。
- VFl 中不能像NSLayoutConstraint那樣可以使用倍數(shù)來設(shè)置約束序苏。
使用示例:
UIView *view = [[UIView alloc]init];
view.backgroundColor = [UIColor blueColor];
[self.view addSubview:view];
UIView *redView = [[UIView alloc]init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
view.translatesAutoresizingMaskIntoConstraints = NO;
redView.translatesAutoresizingMaskIntoConstraints = NO;
NSNumber *margin = @(20);
NSNumber *cen = @(40);
//使用VFL的時候使用該方法
//設(shè)置約束
NSString *vfl = @"H:|-margin-[view]-cen-[redView(==view)]-margin-|";
//使用系統(tǒng)的NSDictionaryOfVariableBindings方法設(shè)置
NSDictionary *metrics = NSDictionaryOfVariableBindings(margin,cen);
NSDictionary *views = NSDictionaryOfVariableBindings(view,redView);
//將方法添加父視圖
NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:kNilOptions metrics:metrics views:views];
[self.view addConstraints:arr];
NSString *vfl1 = @"V:[view(cen)]-margin-|";
NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:vfl1 options:kNilOptions metrics:metrics views:views];
[self.view addConstraints:arr1];
NSString *vfl2 = @"V:[redView(cen)]-margin-|";
NSArray *arr2 = [NSLayoutConstraint constraintsWithVisualFormat:vfl2 options:kNilOptions metrics:metrics views:views];
[self.view addConstraints:arr2];