一,介绍
1,在loadView回调中创建布局;
如果使用nib创建布局,但是需要在代码中修改,可以在viewDidLoad中修改。
2,使用Visual Format Language(VFL)语言写布局限制
二,vfl语法
1,一条语句可以对应多个选项, 比如左右
2,一条语句只能对应一个方向,即是水平和垂直的都要分成2条语句
3,@"H:|-0-[imageView]-0-|" H:代表水平方向; |代表Imageview的container, -0-即是设置的大小;
也可以省略为@"H:|[imageView]|"
4,@"V:[dateLabel]-8-[imageView]-8-[toolbar]" 垂直方向设置间距
5,设置固定数值的方法 @"V:[someView(==50)]" 即是设置高度为50
三,创建布局限制
1,使用constraintsWithVisualFormat方法添加
2,第一个参数添加vfl语句
3,第二、三个参数暂时可以忽略
4,第四个参数指定在vfl中的对象名和对象之间的关系;
- (void)viewDidLoad { [super viewDidLoad]; ... NSDictionary *nameMap = @{@"imageView" : self.imageView, @"dateLabel" : self.dateLabel, @"toolbar" : self.toolbar}; // imageView is 0 pts from superview at left and right edges NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[imageView]-0-|" options:0 metrics:nil views:nameMap]; // imageView is 8 pts from dateLabel at its top edge... // ... and 8 pts from toolbar at its bottom edge NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat: @"V:[dateLabel]-[imageView]-[toolbar]" options:0 metrics:nil views:nameMap]; }
四,添加布局限制
布局约束应该添加到哪个view? 一般来将,就是布局约束中所有view的最近父view节点;
如果约束中只有一个view,那约束就加到自己;
1,发送addConstraints:消息添加布局约束
五,Intrinsic Content Size view本身大小对布局约束的影响
1,image view本身的图片大小会影响布局约束
2,可以设置压缩和放大的优先级系数,当为1000的时候,不允许布局约束改变大小
3,当添加一个优先级较低的小图片到布局中时,会导致另外一个优先级较高的view改变大小
六,其他方式
有些情况下,无法使用vfl语句创建布局约束,比如图片的宽度是高度的1.5倍,这时可以使用NSLayoutConstraint来创建布局之间的相对关系;
NSLayoutConstraint *aspectConstraint = [NSLayoutConstraint constraintWithItem:self.imageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.imageView attribute:NSLayoutAttributeHeight multiplier:1.5 constant:0.0];
其他的attribute是常量,代表某个布局; relateBy的NSLayoutRelationEqual是指等于; multiplier代表倍数;
同样你需要把布局约束加到view中:[self.imageView addConstraint:aspectConstraint];
七,NSAutoresizingMaskLayoutConstraint
在出现autolayout之前,ios使用NSAutoresizingMaskLayoutConstraint,它创建了view和父view之间的关系;
但它会导致和autolayout之间的冲突;
解决方式是关闭NSAutoresizingMaskLayoutConstraint;