美文网首页iOS 开发 iOS学习专题tom
iOS10后使用Masonry进行自动布局出现的问题及处理

iOS10后使用Masonry进行自动布局出现的问题及处理

作者: 大头herob | 来源:发表于2016-10-12 16:34 被阅读7178次

iOS10.0系统发布后,做了一些简单的适配工作(权限,UILabel的大小,导航栏的tintColor等),进行新版本测试突然发现自动布局不好使了。项目中很多地方用到了自适应cell,在iOS10.0之前都是完美运行的。如果此时换成手动计算高度实现自适应,这个工程量还是比较大的。无奈研究了一晚上,终于找到了在iOS10下关于Masonry实现自适应的解决办法。

一、网上查找的一种处理方法--调整代码

这是之前在10.0下出问题的代码

[viewBG mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(10*ScaleScreenH);
        make.right.equalTo(self.contentView).offset(-10*ScaleScreenH);
        make.top.equalTo(self.contentView);
        make.height.equalTo(@(viewBG.height));
    }];
    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self);
        make.right.equalTo(self);
        make.top.equalTo(self);
        make.bottom.equalTo(viewBG).offset(15*ScaleScreenH);
    }];

只需要做一个调整,对于viewBG的底部约束,不能写在contentView的约束里了。至于为什么,我也不清楚。

    [viewBG mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(10*ScaleScreenH);
        make.right.equalTo(self.contentView).offset(-10*ScaleScreenH);
        make.top.equalTo(self.contentView);
        make.height.equalTo(@(viewBG.height));
        make.bottom.equalTo(self.contentView).offset(-15*ScaleScreenH);
    }];
    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self);
    }];

二、文字自适应

方法一中,viewBG的高度是已知的,可以通过高度进行约束。
如果你的代码中是使用label的文字自适应, 那么就有问题了,你需要去手动计算文字的高度,再进行高度适配
如下这种需求(文字无关,随便复制的)


Simulator Screen Shot 2016年10月12日 下午4.16.41.png

在iOS10之前,我的代码是这样写的:

// 布局
      [self.label mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).offset(10);
            make.left.equalTo(self.contentView).offset(16);
            make.right.equalTo(self.contentView).offset(-16);
        }];
        [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.left.right.equalTo(self);
            make.bottom.equalTo(self.label.mas_bottom).offset(10);
        }];

出现的问题:每个label的高度都为0,显示无任何内容
根据方法一进行修改后

// 布局
      [self.label mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).offset(10);
            make.left.equalTo(self.contentView).offset(16);
            make.right.equalTo(self.contentView).offset(-16);
            make.bottom.equalTo(self.contentView).offset(-10);
        }];
        [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self);
        }];
Simulator Screen Shot 2016年10月12日 下午4.25.38.png

文字的高度都不正确,全部都只有一行,当cell滚动界面再出现时,才正确
通过调试发现,iOS10之前, layoutSubViews方法在cell初始化时就会调用两次, 而iOS10之后, layoutSubViews方法只会调用一次
解决方法:1.与方法一配合使用,计算文字的高度,进行高度约束
2.手动使用layoutSubViews多走一次,就可得到正确的高度

- (void)setText:(NSString *)text {
    _text = text;
    
    self.label.text = text;
    // 自动适配并重新布局
    [self.label sizeToFit];// 可以得到label的正确高度
    [self layoutIfNeeded];//会重新调用一次LayoutSubViews
}

结果恢复正常


Simulator Screen Shot 2016年10月12日 下午4.16.41.png

相关文章

网友评论

  • 梁森的简书:你们的真的都可以吗? 为什么我的不行,在iOS11上perfect,在iOS10上不行
  • _zdd:牛逼,解决了我遇到的问题
  • SSSDDDDKKK:有demo吗
    大头herob:@SSSDDDDKKK 例子很简单 所以没有放demo
  • 泡泡茶壶大人:刚刚遇到这个问题, 多谢楼主分享 手动点赞!
  • shengyang:楼主
    威武
    加油
    shengyang:@herob 点了,大神,威武
    大头herob:@谢升阳 点一下喜欢谢谢:smile:
  • Snorlax丶:感谢你解决了我的问题
  • CodingTom:Label 多行高度的问题你可以试着添加
    Label.preferredMaxLayoutWidth = Main_Screen_With;
    这样就可以不用调用 layoutIfNeeded了
    _zdd:确实啊
  • FokHiuFai:太厉害了 在网上找了好久都找不到方法 看了你的文章一下就搞好了! :smile:
    大头herob:@FokHiuFai :+1: 你最棒
  • 游龙飞雪:太棒了,我也遇到这个情况,约束cell的contentview的底部的时候出问题。感谢分享!
    大头herob:@游龙飞雪 :grin::grin:

本文标题:iOS10后使用Masonry进行自动布局出现的问题及处理

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