前言
接手的新项目,有一处自定义了UICollectionViewLayout,实现瀑布流的效果。在iOS12以下的系统运行,一切正常。在真机iOS12的系统运行,进入重用池后出现了显示错乱的问题。
Bug重现
- 重用后,图片显示错乱,其实不止是图片,而是整个约束都乱了,用户图片都跑到最上面去了。
初步排查
- 第一眼看过去,以为是图片的contentMode在某些情况被更改拉伸,试了一圈发现不对,走不通;
- 换了一个思路,会不会是自定义UICollectionViewLayout的问题,于是替换成了系统的UICollectionViewLayout,发现重用或者下拉刷新后约束正常了,但工作量太大,需要进一步排查瀑布流内部的代码逻辑;
-
最后想了下,或许是contentView的原因,查看cell的xib文件,发现所有UI控件都是直接加到self上的,将所有控件嵌入到一个空白的UIView下,问题解决。
- 在网上调研了一圈相关问题,怀疑是translatesAutoresizingMaskIntoConstraints,这个属性的原因,iOS12里面,在cell进入重用池的时候,translatesAutoresizingMaskIntoConstraints被置为了YES,导致直接加到self身上的控件重用后约束出现冲突。
解决后
最后
虽然最后解决问题只花了几分钟,但是排查问题的过程很需要耐心,这种只在某一系统下才能复现的问题,往往很令人头疼,记录下来希望别人少走弯路吧。