wwdc2020发布后,适配iOS14先行版本,发现有些图片居然消失不见了,其实现控件YYAnimatedImageView。github上issue也并未有人提次问题,baidu/google/Stack Overflow找找,也未找到对策。只好自己摸着石头过河,尝试分析啥原因了!
一、调查发现
添加YYAnimatedImageView和UIImageView到self.view上面,同时加载一张本地图片(.image属性赋值),发现YYAnimatedImageView不显示,UIImageView显示正常。
断点调试,po view.layer
,发现YYAnimatedImageView.layer.contents为空,UIImageView.layer.contents有值。
因此大致确认问题,在于未给.layer.contents
赋值!
二、分析源码中
YYAnimatedImageView底层重写了- (void)displayLayer:(CALayer *)layer方法,如下
- (void)displayLayer:(CALayer *)layer {
if (_curFrame) {
layer.contents = (__bridge id)_curFrame.CGImage;
}
}
在没有_curFrame的情况下,不会重新设置layer.contents值。是否是这个问题呢?试看看
2、修改如下:
- (void)displayLayer:(CALayer *)layer {
if (_curFrame) {
layer.contents = (__bridge id)_curFrame.CGImage;
} else {
if (@available(iOS 14.0, *)) {
[super displayLayer:layer];
}
}
}
居然可以了,本地图片、网络图片、动图都可以了。
三、测试发现
当继承UIImageView,重写- (void)displayLayer:(CALayer *)layer方法之后,如果在重写方法里面没有调用super方法,同样加载失败。
四、可能原因分析
如果iOS14-beta版本,在有重写- (void)displayLayer:(CALayer *)layer的情况下,底层实现在设置.image属性的时候,没有设置layer.contents,就由可能出现改问题。而iOS14以下版本,可能实现逻辑不一样,底层会设置layer.contents。
这也只是猜测,等iOS14版本正式看看是否有此问题。