一、苹果的VFL语法约束
在使用约束之前,要先将没有设置frame的view添加到父视图上。如何将view设置为使用AutoLayout约束,取消默认约束。
UIView *red = [[UIView alloc]init];
red.backgroundColor = [UIColor magentaColor];
[self.view addSubview:red];
red.translatesAutoresizingMaskIntoConstraints = NO; // 取消默认的
语法说明:
format:VFL语句,字符串
H:垂直位置
-:某两个视图之间的距离
|:表示父视图
[view]:表示对哪个视图进行约束
(==):表示约束的值
下面是VFL约束的Demo
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[red]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(red)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[red(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(red)]];
二、第三方库Masonry建立约束
与VFL语法相似,用Masonry约束的view也不需要设置frame,使用mas_makeConstraints:^(MASConstraintMaker *make)就可以为view添加约束。注:左部和上部为正数,而右边和底部为负数。
cyan = [[UIView alloc]init];
cyan.backgroundColor = [UIColor cyanColor];
[self.view addSubview:cyan];
[cyan mas_makeConstraints:^(MASConstraintMaker *make) {
/* make.right.equalTo(@-50); // 右边和底部为负数
make.top.equalTo(@50);
make.left.equalTo(@50);
// make.left.and.top.equalTo(@50);and只是连接词
make.height.equalTo(@100);
*/
// 上左下右
// make.edges.mas_equalTo(UIEdgeInsetsMake(50, 50, 50, 100));
make.left.top.equalTo(@0);
// 倍数
make.width.height.equalTo(self.view).multipliedBy(0.5);
}];
更新约束及移除约束。更新约束使用mas_updateConstraints:^(MASConstraintMaker *make)这个方法,更新之后还要通知约束更新,并更新布局。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 更新约束
[UIView animateWithDuration:2 animations:^{
[cyan mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@200);
}];
[cyan setNeedsLayout]; // 通知约束更新
[cyan layoutIfNeeded];
}];
// 将现有的约束全部移除
[UIView animateWithDuration:2 animations:^{
[cyan mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsMake(50, 50, 200, 150));
}];
[cyan setNeedsLayout];
[cyan layoutIfNeeded];
}];
}
三、AutoLayout约束
AutoLayout约束图解.png