runtime交叉方法优化app中所有图片

作者: ZhengYaWei | 来源:发表于2017-03-04 14:39 被阅读550次

运行这段代码,然后在模拟器中点击Debug-->Color Misaligned Color。不出现以外的话会发现图像呈现为谈黄色,这是因为图片在UIImageView上做了拉升,这种拉伸一般都会影响程序的性能。Demo下载地址:https://github.com/ZhengYaWei1992/-UIImageView

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    imageView.center = self.view.center;
    imageView.image = [UIImage imageNamed:@"美女16.jpg"];
    [self.view addSubview:imageView];

如下图:

优化之前

一般的解决方案就是通过CoreGraphic核心绘图这个框架,重新绘制图片,绘制的图片尺寸大小和UIImageView的尺寸大小完全一致,就能达到优化程序的目的。常规做法可能就是封装一个方法,传入图片名、UIImageView的frame,然后返回一张图片。但是这里我并不打算这样做,我的主要目的是:不改写以下代码,只需要简单的拖入一个文件,就连头文件都不用导入,就能达到优化解决图片拉升优化程序的目的。请看下面如何优化。

首先创建一个UIImageView+Misaligned的分类,在分类中的load方法中,使用实现交换系统方法。主要是用zw_setImage方法来交换系统的setImage方法。

//在类被加载到运行时的时候,就会执行
+ (void)load{
    //方法都是定义在类里面,所以获取方法以Class开头
    //获取类方法  参一:获取那个类的方法  参二:获取方法编号,根据SEL找到类对应的方法
    Method originalMethod = class_getInstanceMethod([self class], @selector(setImage:));
    Method swizzledMethod = class_getInstanceMethod([self class], @selector(zw_setImage:));
    //交换方法的实现
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

自定义方法的实现,自定义方法的目的主要是通过CoreGraphic框架绘制一个和UIImageView大小一致的图片,然后显示在UIImageView上,这样就不会导致图片被拉升,进而导致降低app性能。从而达到优化项目中所有图片处理。

//自定义的和系统方法交换
- (void)zw_setImage:(UIImage *)image{
    //第三个参数是分辨率  如果设置为0,会根据设备自动设置图片分辨率
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0);
    //绘制图像
    [image drawInRect:self.bounds];
    //获取结果
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    //关闭上下文
    UIGraphicsEndImageContext();
    //调用系统默认的设置图片的方法,即已经交换过自己写的方法
    [self zw_setImage:result];
}

优化后的效果图:


优化后

相关文章

网友评论

  • 2ac712b8d073:双击666
    ZhengYaWei:@啦啦啦德玛西亚万岁啊 但有一点缺陷
  • c44c0bf3f747:运行时 确实很有用
  • af4e8a35bc89:很好呀! 如果setContentMode也给替换了 就更强大了!
    ZhengYaWei:有时间会给完善一下,这个实现起来应该很简单。思路和这也是基本一样的
  • ISwiftUI:这样画出来的图片就不能自适应了
    ZhengYaWei:好像是啊 ,回头再试试setContentMode方法也给替换了 谢谢提醒啊

本文标题:runtime交叉方法优化app中所有图片

本文链接:https://www.haomeiwen.com/subject/cafjgttx.html