iOS14-beta版本中,YYAnimatedImageView加载图片失败问题分析

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版本正式看看是否有此问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。