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

你可能感兴趣的:(iOS14-beta版本中,YYAnimatedImageView加载图片失败问题分析)