标签:
约束
,参照
frame
约束
,最终还是为了确定其位置
与尺寸
位置
,尺寸
这两个必要条件优先级
的约束优先级
会在例子中说明其用处
先添加四个View
UIView *redView = [[UIView alloc]init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
UIView *blueView = [[UIView alloc]init];
blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueView];
UIView *yellow = [[UIView alloc]init];
yellow.backgroundColor = [UIColor yellowColor];
[self.view addSubview:yellow];
UIView *green = [[UIView alloc]init];
green.backgroundColor = [UIColor greenColor];
[self.view addSubview:green];
mas_makeConstraints
这个方法使左边等于self.view的左边,间距为0
and
与with
其实就是get调用者本身,里面仅仅是return self [redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view.mas_left).offset(0);//使左边等于self.view的左边,间距为0
make.top.equalTo(self.view.mas_top).offset(0);//使顶部与self.view的间距为0
make.width.equalTo(self.view.mas_width).multipliedBy(0.5);//设置宽度为self.view的一半,multipliedBy是倍数的意思,也就是,使宽度等于self.view宽度的0.5倍
make.height.equalTo(self.view.mas_height).multipliedBy(0.5);//设置高度为self.view高度的一半
}];
锚点
,来添加约束,确定自身的位置
与尺寸
图1
中的blueView的效果,我们应当怎样添加约束呢?[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.and.height.equalTo(redView);//使宽高等于redView
make.top.equalTo(redView.mas_top);//与redView顶部对齐
make.leading.equalTo(redView.mas_right);//与redView的间距为0
}];
位置
与尺寸
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.equalTo(redView);//与redView左对齐
make.top.equalTo(redView.mas_bottom);//与redView底部间距为0
make.width.and.height.equalTo(redView);//与redView宽高相等
}];
[green mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(yellow.mas_right);//与yellow右边间距为0
make.top.equalTo(blueView.mas_bottom);//与blueView底部间距为0
make.width.and.height.equalTo(redView);//与redView等宽高
}];
尺寸
的例子,或者是固定位置
的例子,我怕误导大家认为Autolayout是非常死板的,必须把每个控件的约束添加到满足位置
与尺寸
,再去添加其他控件的约束,这样才不会出错位置
与尺寸
,但是有时这两个必须条件可以利用相对
来满足
相对
概念//代码中View的顺序与图中从左到右的View的顺序一致
//例子中,唯一不确定的就是灰色View的宽度,我们先把确定的约束给一个一个的添加上来
//灰1左间距、高度、垂直位置(因为和红1底部对齐)是确定的,添加约束
[gray1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(20);
make.leading.equalTo(self.view.mas_leading).offset(0);
make.bottom.equalTo(red1.mas_bottom);
}];
//红1,宽高、左间距、底间距是确定的,添加约束
[red1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(100);
make.height.mas_equalTo(50);
make.left.equalTo(gray1.mas_right);
make.bottom.equalTo(self.view.mas_bottom).offset(-50);
}];
//灰2,左间距、高度、垂直位置是确定的,宽度要与灰1一致,是为了能均匀填充,添加约束
[gray2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.and.width.equalTo(gray1);
make.leading.equalTo(red1.mas_right);
make.bottom.equalTo(red1.mas_bottom);
}];
//红2,宽高、左间距、底间距是确定的,添加约束
[red2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.and.width.equalTo(red1);
make.leading.equalTo(gray2.mas_right);
make.bottom.equalTo(red1.mas_bottom);
}];
//灰3,左间距、右间距、高度、垂直位置是确定的,添加约束
[gray3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.and.width.equalTo(gray1);
make.leading.equalTo(red2.mas_right);
make.trailing.equalTo(self.view.mas_right);
make.bottom.equalTo(red1.mas_bottom);
}];
相对
,红色方块宽度是固定的,那么水平方向上的间距就需要剩下的三个灰色方块去填充,当界面横屏时,三个灰色方块为了相对
自身宽度要相同,相对
红色边界,self.view边界,间距保持为0,那么就得牺牲自身宽度的稳定,去维持这些相对
的约束 UIView *redView = [[UIView alloc]init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
UIView *greenView = [[UIView alloc]init];
greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:greenView];
UIView *blueView = [[UIView alloc]init];
blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueView];
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view.mas_left).offset(20);
make.bottom.equalTo(self.view.mas_bottom).offset(-20);
make.width.equalTo(self.view.mas_width).multipliedBy(0.2);
make.height.equalTo(self.view.mas_height).multipliedBy(0.2);
}];
[greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(redView.mas_right).offset(20);
make.bottom.equalTo(self.view.mas_bottom).offset(-20);
make.width.equalTo(self.view.mas_width).multipliedBy(0.2);
make.height.equalTo(self.view.mas_height).multipliedBy(0.2);
}];
[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(greenView.mas_right).offset(20);
make.bottom.equalTo(self.view.mas_bottom).offset(-20);
make.width.equalTo(self.view.mas_width).multipliedBy(0.2);
make.height.equalTo(self.view.mas_height).multipliedBy(0.2);
make.left.equalTo(redView.mas_right).offset(20).priority(250);
}];
[self.greenView removeFromSuperview];
[UIView animateWithDuration:1.0f animations:^{
[self.view layoutIfNeeded];
}];
标签:
原文地址:http://www.cnblogs.com/yangliangliang/p/4964720.html