异步裁剪绘制圆角图形

一看到如何绘制一个圆角图形,很多时候想到的都是layer中的方法,也能达到绘制圆角的效果:

例如:

 // 创建一个UIImageView

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];

    // 设置imageView的图片

    imageView.image = [UIImage imageNamed:@"161H62559-0.jpg"];

    // 设置圆角

    imageView.layer.cornerRadius = 100;

    imageView.layer.masksToBounds = YES;

    // 添加到view上

    [self.view addSubview:imageView];

运行效果为:

虽然这样也能绘制出圆角但是性能不太好,如果在tableView上不断的滚动,就要不断地去重绘,且如果设置颜色的话,最好不要设置颜色的透明度,因为这样会严重的影响性能。

 

比较好的一个方法就是通过异步绘制来裁剪圆角:

异步绘制的方法:

在UIImage的分类中:

@implementation UIImage (Extension)

- (void)cj_cornerImageWithSize:(CGSize)size Color:(UIColor *)fillColor completion:(void(^)(UIImage *image))completion {

  dispatch_async(dispatch_get_global_queue(0, 0), ^{      

      // 1. 开启图形上下文

      UIGraphicsBeginImageContextWithOptions(size, YES, 0);

      // 2. 设置填充颜色

      CGRect rect = CGRectMake(0, 0, size.width, size.height);

      [fillColor setFill];

      UIRectFill(rect);

      // 3.贝塞尔曲线

      UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];

      [path addClip];

      // 4.绘制图像

      [self drawInRect:rect];

      // 5.绘制的图像

      UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

      // 6.关闭图形上下文

      UIGraphicsEndImageContext();

      // 7.回调

      dispatch_async(dispatch_get_main_queue(), ^{  

          if (completion != nil) {

              completion(image);

          }

      });

  });

}

@end

 

需要的时候调用此方法:

 // 创建一个UIImageView

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];

    // 设置图片

    UIImage *image = [UIImage imageNamed:@"161H62559-0.jpg"];

    // 设置圆角

    [image cj_cornerImageWithSize:imageView.bounds.size Color:[UIColor whiteColor] completion:^(UIImage *image){

            imageView.image = image;

    }];

    [self.view addSubview:imageView];

运行的结果:

 

 

posted @ 2016-11-02 16:05  简简单单0  阅读(386)  评论(0编辑  收藏  举报