iOS 10关于Masonry的适配问题

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

在stackOverFlow上并没有找到详细的解决方案,于是果断去了gitHub找到Masonry的作者主页上看开发者有没有对Masonry提了新的问题,果然.....

iOS 10关于Masonry的适配问题_第1张图片
Snip20180711_12.png
iOS 10关于Masonry的适配问题_第2张图片
Snip20180711_13.png

下面是我的项目在iOS10下出现的显示紊乱的情况

iOS 10关于Masonry的适配问题_第3张图片
Snip20180711_16.png
iOS 10关于Masonry的适配问题_第4张图片
Snip20180711_19.png

这是之前在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的约束里了。至于为什么,我也不清楚,对UIView的底层研究还没有那么深......

改完之后的代码

[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);
}];

改完之后正常运行的效果图

iOS 10关于Masonry的适配问题_第5张图片
Snip20180711_20.png
iOS 10关于Masonry的适配问题_第6张图片
Snip20180711_21.png

最后一点问题,如果你的项目里有UICollectionView和UIPageControl的使用,在iOS10下,也会出现问题,断点测试后发现indexPath.item的属性值是随机变的(打印出来的数据是0可能直接跳到2,或者3直接跳到0。因为iOS10也对UICollectionView的渲染做了改变。当我们编译iOS 10的app的时候,这个Pre-Fetching默认是enable的。当然,如果有一些原因导致你必须用到iOS 10之前老的生命周期,你只需要给collectionView加入新的prefetchingEnabled属性即可。如果你不想用到Pre-Fetching,那么把这个属性变成No即可。
这里需要设置一下prefetchingEnabled属性为NO(默认是YES)。

self.contentCollectionView.prefetchingEnabled = NO;

你可能感兴趣的:(iOS 10关于Masonry的适配问题)