iOS 10关于Masonry的适配问题

作者: flightlessBirdT | 来源:发表于2016-10-11 10:11 被阅读1018次

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

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

Snip20161011_7.png Snip20161011_8.png

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

Snip20161011_16.png Snip20161011_17.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);
}];

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

Snip20161011_13.png Snip20161011_15.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的适配问题

    iOS10.0系统发布后,做了一些简单的适配工作(权限,UILabel的大小,导航栏的tintColor等),立即...

  • iOS 10 - Xcode8的各种适配问题

    iOS 10 - Xcode8的各种适配问题 iOS 10 - Xcode8的各种适配问题

  • iOS 10 的适配问题

    前言 随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,...

  • iOS开发 - 简单实用的屏幕适配(WHC_AutoLayout

    在iOS 开发中适配屏的问题大家一定接触过masonry想必大家都很熟悉, masonry 简化了AutoLayo...

  • 简单解决iOS10适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有...

  • iOS 10 的适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有...

  • iOS10的适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有...

  • iOS 10 的适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有...

  • iOS 适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有...

  • iOS 10 的适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有...

网友评论

  • 清晨日暮:你之前的约束写的有问题啊
    make.height.equalTo(@(viewBG.height));
    这句话有问题 — —!
    flightlessBirdT:@清晨日暮 哪里有问题?这个视图我是用frame创建出来的 是具有真实高度的。这种写法虽然不好 但是布局是没有问题的。
  • Ryan文濤:第一张效果图,每个cell的阴影值你是设置的多少?可以看下设置阴影值的那两句代码吗?
    Ryan文濤:@flightlessBirdT 谢谢:smile:
    flightlessBirdT:@Ryan文濤
    viewBG.backgroundColor = [UIColor whiteColor];
    viewBG.layer.cornerRadius = 2.0;
    [[viewBG layer] setShadowOffset:CGSizeMake(0, 1)];
    [[viewBG layer] setShadowRadius:1];
    [[viewBG layer] setShadowOpacity:0.2];
    [[viewBG layer] setShadowColor:[UIColor grayColor].CGColor];
  • 马爷:楼主 这个没有看懂 make.height.equalTo(@(viewBG.height)); 给他自己加约束 这个是怎么计算的?
    flightlessBirdT:@马爷 对啊。系统怎么可能帮你计算frame。
    马爷:@flightlessBirdT 是已经算好了 不是系统自己算是吧?
    flightlessBirdT:@马爷 你好,这个viewBG是一个父视图,我是算好了他内部的很多子视图后得出他的高度。比如一个view你设置约束:上下左右间距。你也可以上左右间距,再来个高度。这个高度可以提前算出来。
  • 0d22cb0bba7a:mas_height
    flightlessBirdT:@0d22cb0bba7a 我的写法没有问题
  • R0b1n_L33:make.height.equalTo(@(viewBG.height));
    这句话有问题
    网密:为什么有@()?
    0d22cb0bba7a:@flightlessBirdT mas_height
    flightlessBirdT:@ljysdfz 哪里有问题?

本文标题:iOS 10关于Masonry的适配问题

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