零碎知识点iOS开发攻城狮的集散地实用轮子

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

2017-03-04  本文已影响550人  ZhengYaWei

运行这段代码,然后在模拟器中点击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];
}

优化后的效果图:


优化后
上一篇下一篇

猜你喜欢

热点阅读