iOS图片圆角的裁剪优化

作者: 断剑 | 来源:发表于2016-07-25 21:37 被阅读2025次

    前面已经介绍过一种给UI控件设置圆角的方法了,今天给大家介绍一种性能更加优化的为图片设置圆角的方法
    Xib中设置控件的圆角、边框效果
    当我们在项目中显示图片的时候,如果想要将正方形的图片转换为原型图片的话,如果使用layer进行设置有时就会有一点点卡(特别是在tableView中进行显示的时候)

    • 通常的解决的办法就是通过Quartz2D将图形绘制出一张圆形图片来进行显示。

    1.创建UIImage的分类实现圆角方法

    #import <UIKit/UIKit.h>
    
    @interface UIImage (ZZYCircleImage)
    
    - (UIImage *)circleImage;
    
    @end
    
    
    #import "UIImage+ZZYCircleImage.h"
    
    @implementation UIImage (ZZYCircleImage)
    
    - (UIImage *)circleImage
    {
        
        //1.开启图片图形上下文:注意设置透明度为非透明
        UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
        //2.开启图形上下文
        CGContextRef ref = UIGraphicsGetCurrentContext();
        //3.绘制圆形区域(此处根据宽度来设置)
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.width);
        CGContextAddEllipseInRect(ref, rect);
        //4.裁剪绘图区域
        CGContextClip(ref);
        
        //5.绘制图片
        [self drawInRect:rect];
        
        //6.获取图片
        UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
        //7.关闭图形上下文
        UIGraphicsEndImageContext();
        
        return image;
    }
    
    @end
    

    2.扩展——SDWebImage的简单封装

    #import <UIKit/UIKit.h>
    
    @interface UIImageView (ZZYImageView)
    
    - (void)setCircleImage:(NSString *)imageUrl withPlaceholderImage:(NSString *)placeholderImageName;
    
    @end
    
    #import "UIImageView+ZZYImageView.h"
    #import <UIImageView+WebCache.h>
    #import "UIImage+ZZYCircleImage.h"
    
    @implementation UIImageView (ZZYImageView)
    
    - (void)setCircleImage:(NSString *)imageUrl withPlaceholderImage:(NSString *)placeholderImageName
    {
        UIImage * placeholderImage = [UIImage imageNamed:placeholderImageName];
        [self sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:placeholderImage completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            self.image = image ? [image circleImage]:[placeholderImage circleImage];
        }];
    }
    
    
    
    @end
    
    

    相关文章

      网友评论

      • cba8dfa3f0f4:博主,棒棒
      • 3165f8525585:这个实现在imageView比较少的情况下是没什么问题的,但你的图片绘制是在主线程里进行的,在tableView中滑动的时候会卡顿,上下不停滑动的话同一张图片会重复绘制。最好的方法还是自己写缓存,在后台线程画好后缓存到内存里,第二次显示直接从内存拿。
        3165f8525585:@Mr大喵喵 参考SDWebImage的实现。
        Mr大喵喵:@Jeff_Wong 请问下你在tableView 中绘制图片的代码可以分享一下么,绘制是在cell 里面执行操作么,是分线程设置然后回到主线程执行
        断剑: @Jeff_Wong 嗯,谢谢你
      • 奉灬孝:能写个demo展示下吗?刚用你的方法试了一下,报错了, <Error>: CGContextAddEllipseInRect: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
        <Error>: clip: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
        奉灬孝:@断剑 嗯,给张具体的图片就OK了
        断剑:你看看是不是上下文那里获取、设置出问题了啊
        iManuQiao:@奉灬孝 看上去UIGraphicsGetCurrentContext()那行没有获得正确的context地址

      本文标题:iOS图片圆角的裁剪优化

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