Masonry 布局在iOS7 上崩溃的解决方案总结

移动开发 来源:wg689 35℃ 0评论

1)报错error

2017-01-10 19:17:30.448 DYZB[10752:60b] *** Assertion failure in -[DYNobleListView layoutSublayersOfLayer:], /SourceCache/UIKit/UIKit-2903.23/UIView.m:8540
libc++abi.dylib: terminate_handler unexpectedly threw an exception

2)出现场景:一个View是 xib和mas混用

Xib和mas混着用在iOS7上就是大坑,要么全用mas,要么全用xib,动态的部分控件隐藏和改变constraint 来实现动态效果。

- (void)awakeFromNib{ [super awakeFromNib]; //改变布局 }

awakeFromNib设置mas 布局,

- (void)layoutSubviews{ [super layoutSubviews] //改变布局 };

layoutSubviews里面也有使用mas改变布局的动作

3.1)百度有很多种解决方案,我试的80%的不会有用(我试过好多次)


图片.png

3.2)stackoverflow 的方案(不一定好使)

http://stackoverflow.com/questions/24549334/autolayout-crash-when-applying-transform-assertion-failure-in-layoutsublayers
http://stackoverflow.com/questions/26751801/autolayout-issue-for-uitextfield-in-ios

4)个人经验85%的概率会有用的方案:手写frame

使用mas 的布局在ios7 上有概率性的崩溃,当有问题的时候手写frame = CGRectMake() 即可解决
项目中遇到的 视屏的布局混乱,部分使用手写frame 设置frame如(frame = cgrectMake(20,屏幕宽度*0.5,A控件的底部+10,40))
如果还不行 ,就修改下改变布局的时机 ,90% 的概率就可以了

5)曾经遇到的问题使用手写frame解决的案例

案例1)iOS7视频界面布局混乱,iOS8 以上一切正常,手写frame 解决问题
案例2)某个appzuifuza最复杂的界面ios7 上 一进入就崩溃,某同事在willlayOutsubView方法里面,使用mas 改变了布局,后来手写frame 搞定
案例3)某界面- (void)layoutSubviews{使用mas 立马崩溃,使用手写frame = CGRectMake() 在ioS7 上就不崩溃
初步怀疑 xib 在layoutSubviews没有合理的加载,这个时候在xib 上使用mas 布局会有冲突 (此时改代码记得clean 项目)

当然修改布局的调用时机也可以解决崩溃的,比如不在layoutSubviews修改布局(验证有效的)