-
删除最左边的控件,自动重算当前布局方法
image.png
删除橙色后
image.png
实现思路:第一步,三个颜色正常写约束,实现图中效果
第二步,在中间的黄色视图写约束的基础上,增加一个与与最左边的约束,优先级比与橙色约束的优先级低。当橙色消失后,与橙色的约束消失,自动使用与屏幕边距的约束
[self.yellowView mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(100);
make.top.offset(50);
make.left.equalTo(self.orangeView.mas_right).offset(20);
//当橙色View消失后,黄色View缺少左边约束,所以给其加一个优先级更低的左边约束。当第一个左边约束失效后,这个约束就起作用了
make.left.equalTo(self.view.mas_left).offset(20).priority(300);//优先级默认为1000 这里设置小于1000
}];
点击删除后通知系统重新布局
[self.yellowView removeFromSuperview];
[UIView animateWithDuration:0.5 animations:^{
//强制刷新布局
[self.view layoutIfNeeded];
}];
补充:
[self.view setNeedsLayout];//做更新标记
[self.view layoutIfNeeded]; //做必要布局
[self.view layoutSubviews];//所有子视图重新布局
make.left.equalTo(self.view.mas_left); make.right.equalTo(self.view.mas_right);
可以缩写为
make.left.equalTo(self.view); make.right.equalTo(self.view);
总结: equalTo括号里如果不标明对齐对象的哪一边,那么就默认等于make后面的边。
make.left.equalTo(self.view); make.right.equalTo(self.view);
可以缩写为
make.left.right.equalTo(self.view);
总结: 系统会自动使用分配律,让括号里的对象对应的边与make后面的边对应。
make.top.left.bottom.right.equalTo(self.view);
可以缩写为
make.edges.equalTo(self.view);
总结: 上下左右就等于视图的边际,masonry缩写为edge
想让视图等于固定的一个值
make.width.mas_equalTo(100); make.size.mas_equalTo(CGSizeMake(100, 30)); make.edges.mas_equalTo(UIEdgeInsetsMake(10, 10, 10, 10));
总结:mas_equalTo的括号里放的是具体的数值和结构体,不是对象,也就是用assign修饰的数据类型。
当scrollview内部的控件用masonry约束时,如果超出屏幕范围需要滚动,实现办法是在最底部的视图约束中加一句
make.bottom.equalTo(scrollView);
这样,系统会设置scrollview的contentsize显示最底部控件。
2018-7-20 补充:
如果scrollVIew只需要上下滚动,不要左右滚动,需要在scrollview上加一个contentView,让contentView的的宽度等于scrollview的宽度,高度设置为大于等于0,让高度可收缩改变,
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.scrollView);
make.width.equalTo(self.scrollView);
make.height.greaterThanOrEqualTo(@0.f);
}];
把剩余的子控件全部添加在contentView上,最底部的控件底部等于contentView
[self.bottomGapLineView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.width.equalTo(self.scrollView);
make.height.mas_equalTo(10);
make.top.equalTo(self.bottomCardView.mas_bottom);
make.bottom.equalTo(_contentView);//这里的优先级最高 contentsize 优先适应这个这里
}];
这样,就可以防止scrollVIew在4英寸以及更小的机型上出现scrollView横向滚动的现象,也就是保证contentSize的width为0。
在初次布局使用了mas_makeConstraints后,后续更新frame不可以直接修改frame的任何一个值,需要使用mas_updateConstraints来进行更新,否则会出现奇怪的布局问题,不符合预期。
关于remakeContraints,是删除掉之前所有的约束,添加新的约束,updateConstraints是更新,对原来的不影响。
让视图铺满父视图,一句代码搞定
make.edges.equalTo(self.contentView);
让子视图的边等于父视图
网友评论