Open afskalsfk opened 4 years ago
修改成上述这样解决,如有更好办法,麻烦作者更新下
有人继续维护这个库吗?
暂时可以采用 @afskalsfk 的方法解决
目前只能这样解决了,创建一个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]; } } }
@yuanjunxiao 可以,采用了
目前只能这样解决了,创建一个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
目前只能这样解决了,创建一个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
可以保证执行的顺序吗,应该要调整分类的编译顺序对吧
目前只能这样解决了,创建一个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
可以保证执行的顺序吗,应该要调整分类的编译顺序对吧
分类的方法都是放在类原来方法的前面,没有编译顺序的问题。除非你有多个分类,重写了相同的方法,才会存在分类的编译顺序问题。
目前只能这样解决了,创建一个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
可以保证执行的顺序吗,应该要调整分类的编译顺序对吧
分类的方法都是放在类原来方法的前面,没有编译顺序的问题。除非你有多个分类,重写了相同的方法,才会存在分类的编译顺序问题。
是的,除非有多个分类重写了这个方法
1
MARK
这是来自QQ邮箱的假期自动回复邮件。 谢谢,你的邮件我已经收到!
这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。
ios14重写displayLayer方法后不再默认调用super
作者:双鱼子曰1987 链接:https://www.jianshu.com/p/9c117dbe22a8 来源:简书