ibireme / YYKit

A collection of iOS components.
MIT License
13.99k stars 3.69k forks source link

ios14YYAnimatedImageView图片显示问题 #573

Open afskalsfk opened 4 years ago

afskalsfk commented 4 years ago

ios14重写displayLayer方法后不再默认调用super

作者:双鱼子曰1987 链接:https://www.jianshu.com/p/9c117dbe22a8 来源:简书

afskalsfk commented 4 years ago

修改成上述这样解决,如有更好办法,麻烦作者更新下

oshiwei commented 4 years ago

有人继续维护这个库吗?

TungKamLau commented 4 years ago

暂时可以采用 @afskalsfk 的方法解决

yuanjunxiao commented 4 years ago

目前只能这样解决了,创建一个YYAnimatedImageView的分类,通过方法交换。

TungKamLau commented 4 years ago

@yuanjunxiao 可以,采用了

oshiwei commented 4 years ago

目前只能这样解决了,创建一个YYAnimatedImageView的分类,通过方法交换。

  • (void)load { // 获取系统的方法 Method displayLayerMethod = class_getInstanceMethod(self, @selector(displayLayer:)); // 获取更新的方法 Method displayLayerNewMethod = class_getInstanceMethod(self, @selector(displayLayerNew:)); // 方法交换 method_exchangeImplementations(displayLayerMethod, displayLayerNewMethod); }

  • (void)displayLayerNew:(CALayer )layer { Ivar imageIvar = class_getInstanceVariable([self class], "_curFrame"); UIImage image = object_getIvar(self, imageIvar); if (image) { layer.contents = (__bridge id)image.CGImage; } else { if (@available(iOS 14.0, *)) { [super displayLayer:layer]; } } }

分类直接就可以覆盖原来方法了,不用swizzling

CoderLawrence commented 3 years ago

目前只能这样解决了,创建一个YYAnimatedImageView的分类,通过方法交换。

  • (void)load { // 获取系统的方法 Method displayLayerMethod = class_getInstanceMethod(self, @selector(displayLayer:)); // 获取更新的方法 Method displayLayerNewMethod = class_getInstanceMethod(self, @selector(displayLayerNew:)); // 方法交换 method_exchangeImplementations(displayLayerMethod, displayLayerNewMethod); }
  • (void)displayLayerNew:(CALayer )layer { Ivar imageIvar = class_getInstanceVariable([self class], "_curFrame"); UIImage image = object_getIvar(self, imageIvar); if (image) { layer.contents = (__bridge id)image.CGImage; } else { if (@available(iOS 14.0, *)) { [super displayLayer:layer]; } } }

分类直接就可以覆盖原来方法了,不用swizzling

可以保证执行的顺序吗,应该要调整分类的编译顺序对吧

oshiwei commented 3 years ago

目前只能这样解决了,创建一个YYAnimatedImageView的分类,通过方法交换。

  • (void)load { // 获取系统的方法 Method displayLayerMethod = class_getInstanceMethod(self, @selector(displayLayer:)); // 获取更新的方法 Method displayLayerNewMethod = class_getInstanceMethod(self, @selector(displayLayerNew:)); // 方法交换 method_exchangeImplementations(displayLayerMethod, displayLayerNewMethod); }
  • (void)displayLayerNew:(CALayer )layer { Ivar imageIvar = class_getInstanceVariable([self class], "_curFrame"); UIImage image = object_getIvar(self, imageIvar); if (image) { layer.contents = (__bridge id)image.CGImage; } else { if (@available(iOS 14.0, *)) { [super displayLayer:layer]; } } }

分类直接就可以覆盖原来方法了,不用swizzling

可以保证执行的顺序吗,应该要调整分类的编译顺序对吧

分类的方法都是放在类原来方法的前面,没有编译顺序的问题。除非你有多个分类,重写了相同的方法,才会存在分类的编译顺序问题。

CoderLawrence commented 3 years ago

目前只能这样解决了,创建一个YYAnimatedImageView的分类,通过方法交换。

  • (void)load { // 获取系统的方法 Method displayLayerMethod = class_getInstanceMethod(self, @selector(displayLayer:)); // 获取更新的方法 Method displayLayerNewMethod = class_getInstanceMethod(self, @selector(displayLayerNew:)); // 方法交换 method_exchangeImplementations(displayLayerMethod, displayLayerNewMethod); }
  • (void)displayLayerNew:(CALayer )layer { Ivar imageIvar = class_getInstanceVariable([self class], "_curFrame"); UIImage image = object_getIvar(self, imageIvar); if (image) { layer.contents = (__bridge id)image.CGImage; } else { if (@available(iOS 14.0, *)) { [super displayLayer:layer]; } } }

分类直接就可以覆盖原来方法了,不用swizzling

可以保证执行的顺序吗,应该要调整分类的编译顺序对吧

分类的方法都是放在类原来方法的前面,没有编译顺序的问题。除非你有多个分类,重写了相同的方法,才会存在分类的编译顺序问题。

是的,除非有多个分类重写了这个方法

yangfangxue commented 5 months ago

1

yangfangxue commented 5 months ago

MARK

huangyuding commented 5 months ago

这是来自QQ邮箱的假期自动回复邮件。   谢谢,你的邮件我已经收到!

Svyanto commented 5 months ago

这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。