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

前两天通过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自动布局出错问题的一种解决办法)