修改 SDWebImage 支持任意 View

1,152 阅读1分钟

首发于公众号

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 的方法,修改的位置非常少,几乎不影响原有逻辑,而且以后还能跟进官方源码更新。