首发于公众号
SDWebImage 默认支持 UIImageView 和 UIButton 及其子类,对于大部分的应用场景足够好用了。
对于继承于 UIView 或者 UIControl 的自定义的控件,而又需要支持 SDWebImage 的话,就只能自己写对应的分类来实现。
有没有一劳永逸的方法,对于任何 View,都不用自己写对应的分类方法就能直接支持 SDWebImage ?
有~接下来介绍我的修改思路
官方的 SDWebImage 只支持 UIImageView 和 UIButton 这两种类型,那么只要把这两种类型抽象出来,任何基于 UIView 的控件都可以使用 SDWebImage 的分类方法,那么就可以通用化了。
抽象 UIImageView 为 SDUImageViewProtocol
@protocol SDUIImageViewProtocol <NSObject>
@optional
@property (nullable, nonatomic, strong) UIImage *image;
@property (nullable, nonatomic, strong) UIImage *highlightedImage;
@end
抽象 UIButton 为 SDUIButtonProtocol
@protocol SDUIButtonProtocol <NSObject>
@optional
- (void)setImage:(UIImage *_Nullable)image forState:(UIControlState)state;
- (void)setBackgroundImage:(UIImage *_Nullable)image forState:(UIControlState)state;
@end
然后把对应的 UIImageView 和 UIButton 分类都修改为 UIView,再修改设置UIImage 时相关类型判断的逻辑,详细代码可以参考我的 github 仓库:cntrump/SDWebImage
抽象完成以后,只要实现了以上两个协议接口的控件,都可以直接使用 SDWebImage 的方法,修改的位置非常少,几乎不影响原有逻辑,而且以后还能跟进官方源码更新。