前两天通过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),就这样,问题就解决了……