wwdc2020發(fā)布后,適配iOS14先行版本,發(fā)現(xiàn)有些圖片居然消失不見了,其實現(xiàn)控件YYAnimatedImageView。github上issue也并未有人提次問題,baidu/google/Stack Overflow找找,也未找到對策。只好自己摸著石頭過河,嘗試分析啥原因了!
一、調查發(fā)現(xiàn)
添加YYAnimatedImageView和UIImageView到self.view上面,同時加載一張本地圖片(.image屬性賦值),發(fā)現(xiàn)YYAnimatedImageView不顯示,UIImageView顯示正常。
斷點調試,po view.layer,發(fā)現(xiàn)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];
}
}
}
居然可以了,本地圖片、網絡圖片、動圖都可以了。
三、測試發(fā)現(xiàn)
當繼承UIImageView,重寫- (void)displayLayer:(CALayer *)layer方法之后,如果在重寫方法里面沒有調用super方法,同樣加載失敗。
四、可能原因分析
如果iOS14-beta版本,在有重寫- (void)displayLayer:(CALayer *)layer的情況下,底層實現(xiàn)在設置.image屬性的時候,沒有設置layer.contents,就由可能出現(xiàn)改問題。而iOS14以下版本,可能實現(xiàn)邏輯不一樣,底層會設置layer.contents。
這也只是猜測,等iOS14版本正式看看是否有此問題。