//
在类被加载到运行时的时候,就会执行
+ (void)load {
// 1. 获取 UIImageView 类的 实例方法 `setImage:`
Method originalMethod = class_getInstanceMethod([self class], @selector(setImage:));
// 2. 获取 UIImageView 类的 实例方法 `cz_setImage:`,本身定义在分类中
Method swizzledMethod = class_getInstanceMethod([self class], @selector(cz_setImage:));
// 3. 交换方法 setImage 和 cz_setImage,交换完成之后
// 1> 调用 setImage 相当于调用 cz_setImage
// 2> 调用 cz_setImage 相当于调用 setImage
method_exchangeImplementations(originalMethod, swizzledMethod);
}
/// 1. 当在其他位置调用 `setImage` 方法时,`自动`调用 cz_setImage: 方法
- (void)cz_setImage:(UIImage *)image {
NSLog(@"%s %@", __FUNCTION__, image);
// 1. 根据 imageView 的大小,重新调整 image 的大小
// 使用 `CG` 重新生成一张和目标尺寸相同的图片
UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0);
// 绘制图像
[image drawInRect:self.bounds];
// 取得结果
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
// 关闭上下文
UIGraphicsEndImageContext();
// 调用系统默认的 setImage 方法
[self cz_setImage:result];
}
+ (void)load {
// 1. 获取 UIImageView 类的 实例方法 `setImage:`
Method originalMethod = class_getInstanceMethod([self class], @selector(setImage:));
// 2. 获取 UIImageView 类的 实例方法 `cz_setImage:`,本身定义在分类中
Method swizzledMethod = class_getInstanceMethod([self class], @selector(cz_setImage:));
// 3. 交换方法 setImage 和 cz_setImage,交换完成之后
// 1> 调用 setImage 相当于调用 cz_setImage
// 2> 调用 cz_setImage 相当于调用 setImage
method_exchangeImplementations(originalMethod, swizzledMethod);
}
/// 1. 当在其他位置调用 `setImage` 方法时,`自动`调用 cz_setImage: 方法
- (void)cz_setImage:(UIImage *)image {
NSLog(@"%s %@", __FUNCTION__, image);
// 1. 根据 imageView 的大小,重新调整 image 的大小
// 使用 `CG` 重新生成一张和目标尺寸相同的图片
UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0);
// 绘制图像
[image drawInRect:self.bounds];
// 取得结果
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
// 关闭上下文
UIGraphicsEndImageContext();
// 调用系统默认的 setImage 方法
[self cz_setImage:result];
}