在开发中图片样式会遇到圆型,此时的做法有两种第一种直接调用系统的imageView的layer属性:imageView.layer.cornerRadius 设置它的值等于imageView的一半.但是这样做放在表格中十分消耗性能,所以不考虑,另外一种方法那就是绘制图片,代码如下:
-(UIImage *)dd_imageWithSize:(CGSize)size fillColor:(UIColor *)fillColor{
//开启上下文
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
CGRect rect = CGRectMake(0, 0, size.width, size.height);
[fillColor setFill];
UIRectFill(rect);
//贝塞尔曲线
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];
[path addClip];
//绘制图像
[self drawInRect:rect];
//取得结果
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndPDFContext();
//返回结果
return result ;
}
通过模拟器的混合模式测试,图片性能OK,但是我们还需要考虑到CPU运行时间,通过在方法里面的第一步和最后一步调用方法CACurrentMediaTime(),得到方法的前后运行时间
我们可以算出时间为0.026178秒,此时我考虑优化,用多线程异步回调的方法代码如下:
-(void)dd_imageWithSize:(CGSize)size fillColor:(UIColor *)fillColor completeBlock:(void(^)(UIImage *))completeBlock{
NSTimeInterval start = CACurrentMediaTime();
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//开启上下文
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
CGRect rect = CGRectMake(0, 0, size.width, size.height);
[fillColor setFill];
UIRectFill(rect);
//贝塞尔曲线
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];
[path addClip];
//绘制图像
[self drawInRect:rect];
//取得结果
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndPDFContext();
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
if (completeBlock !=nil) {
completeBlock(result);
}
});
});
NSLog(@"%f",CACurrentMediaTime()-start);
}
通过异步全局,完成图片处理代码,再把图片处理结果的Block回调,放在异步主队列中.通过测试方法执行的秒数为0.000045秒.