使用masonry注意点

  • 删除最左边的控件,自动重算当前布局方法


    使用masonry注意点_第1张图片
    image.png

    删除橙色后


    使用masonry注意点_第2张图片
    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);让子视图的边等于父视图

你可能感兴趣的:(使用masonry注意点)