美文网首页
使用masonry注意点

使用masonry注意点

作者: 张俊凯 | 来源:发表于2018-03-22 23:32 被阅读21次
    • 删除最左边的控件,自动重算当前布局方法


      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);让子视图的边等于父视图

    相关文章

      网友评论

          本文标题:使用masonry注意点

          本文链接:https://www.haomeiwen.com/subject/iqiaqftx.html