ibireme/YYImage

iOS 14.0 YYAnimatedImageView 无法显示正常图片

Closed this issue · 7 comments

版本1.0.4

iOS 14.0 YYAnimatedImageView 无法显示正常图片

14.0 系统调用了此方法,YYAnimatedImageView没有正确处理

  • (void)displayLayer:(CALayer *)layer;
MyHZ commented

YYAnimatedImageView.m

  • (void)displayLayer:(CALayer *)layer {
    UIImage *currentFrame = _curFrame;
    if (!currentFrame) {
    currentFrame = self.image;
    }
    if (currentFrame) {
    layer.contentsScale = currentFrame.scale;
    layer.contents = (__bridge id)currentFrame.CGImage;
    }
    }

YYAnimatedImageView.m

- (void)displayLayer:(CALayer *)layer {
    if (_curFrame) {
        layer.contents = (__bridge id)_curFrame.CGImage;
    } else {
        // If we have no animation frames, call super implementation. iOS 14+ UIImageView use this delegate method for rendering.
        if ([UIImageView instancesRespondToSelector:@selector(displayLayer:)]) {
            [super displayLayer:layer];
        }
    }
}

我们没有改ibireme的源码,因为日后他可能会要升级,我是用类别hook了那个方法:displayLayer:

+ (void)load
{
    Method a = class_getInstanceMethod(self, @selector(displayLayer:));
    Method b = class_getInstanceMethod(self, @selector(swizzing_displayLayer:));
    method_exchangeImplementations(a, b);
}

- (void)swizzing_displayLayer:(CALayer *)layer
{   
    //通过变量名称获取类中的实例成员变量
    Ivar ivar = class_getInstanceVariable(self.class, "_curFrame");
    UIImage *_curFrame = object_getIvar(self, ivar);

    if (_curFrame) {
        layer.contents = (__bridge id)_curFrame.CGImage;
    } else {
        if (@available(iOS 14.0, *)) {
            [super displayLayer:layer];
        }
    }
}

pod 'YYImage', :git => 'https://github.com/QiuYeHong90/YYImage.git'
临时解决

  • (void)displayLayer:(CALayer *)layer {
    [super displayLayer:layer];
    if (_curFrame) {
    layer.contents = (__bridge id)_curFrame.CGImage;
    }
    }

哦豁,已解决

aixl commented

pod 'YYImage', :git => 'https://github.com/QiuYeHong90/YYImage.git'
临时解决

貌似还有偶现的不显示问题