您的位置:首页 > 产品设计 > UI/UE

利用运行时,给UIImageView写一个分类,交换里面的setImage的方法,可以重绘图片,提高内存的利用率(要是没有重绘图片,直接使用系统提供的setImag就会造成占用大量的内存问题)

2017-05-01 10:28 1431 查看
//
在类被加载到运行时的时候,就会执行

+ (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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐