美文网首页
关于iOS10适配过程中masonry自动布局出错问题的一种解决

关于iOS10适配过程中masonry自动布局出错问题的一种解决

作者: 凌虚若寒 | 来源:发表于2016-09-30 14:14 被阅读716次

    前两天通过Xcode8提交的适配iOS10的应用新版本终于成功上线,然而在预定上线时间的头一天下午才开始将Xcode升级到8.0版本,之后的一路坑终于摸索着过来了,其中推送、基本设置、相机等权限问题都有很多资料提供,而关于masonry适配问题,只是说之前iOS版本下对masonry使用所写代码并不规范不够严谨,但也没具体给出解决方案。

    本人先是选择一处出现问题的cell的自动布局改为预先计算frame模型来解决这个问题,也就是说放弃使用masonry,但的确是太耗费功夫,眼看第二天就要打包提交应用商店,不能忍,就继续摸索masonry到底问题出在哪儿了,还好最后找出一种解决方案。下面以代码来说明,首先贴出之前的代码:

    - (void)layoutSubviews {
      [super layoutSubviews];
      ……
      [self.bottomLineView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.leading.trailing.mas_equalTo……;
        make.height.mas_equalTo(kLineHeight);
      }];
      [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.leading.trailing.mas_equalTo(self);
        make.bottom.mas_equalTo(self.bottomLineView);
      }];
    }
    

    这里是我平时使用masonry的写法,也就是说self.contentView的bottom是根据self.bottomLineView计算出来的,这样写在iOS10之前完全没问题,然而当升级到Xcode8之后再Run控制台就出现了布局有问题,列举一堆计算contentView高度时的约束,最后说self.contentView.height == 0,这就是问题所在了。多次尝试修改,终于发现按照下面方式修改就没问题了:

    - (void)layoutSubviews {
     [super layoutSubviews];
     ……
     [self.bottomLineView mas_makeConstraints:^(MASConstraintMaker *make) {
       make.top.leading.trailing.mas_equalTo……;
       make.height.mas_equalTo(kLineHeight);
       make.bottom.mas_equalTo(self.contentView);
     }];
     [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
       make.top.leading.trailing.bottom.mas_equalTo(self);
     }];
    }
    

    显然,我只是将原本self.contentView的bottom约束写到了约束它的self.bottomLineView的约束条件中,而将self.contentView的约束条件改为四个边全都等于cell自身(self),就这样,问题就解决了……

    相关文章

      网友评论

          本文标题:关于iOS10适配过程中masonry自动布局出错问题的一种解决

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