处理圆形图片

做项目的时候经常遇到过自定义cell,就拿朋友圈来说,用户的头像也是要切圆形的,通常都是在cell里将imageView的layer做处理,像这样

UIImageView *imageView = [[UIImageView alloc] init];

imageView.layer.cornerRadius = 10;//这里如果是圆形效果就用imageView的宽高除以2(宽高都相等的情况下)

imageView.layer.masksToBounds = YES;

 

一开始做这个功能时候都是用官方提供的方法,后来在网上看MJ的教程视频他有提到过这个layer,具体我忘记了,主要是提到这个layer是系统封装好的消耗的内存会相对比较大,只以一两个imageView是很难测出来,在多个需要处理的imageView时候MJ也推荐用图形上下文去处理,我自己去测试过,写一个自定义TableViewCell,添加子类控件UIImageView,用两种方法对比,layer和图形上下文切的圆形图,开始是加载20个tableVIewCell,内存消耗没有多在区别,后来加到50,100,200的时候内存消耗就有点明显了。

这里我自己也尝试封装了图形上下文,可能不完美,希望各位大神给点建议,还有感谢MJ

 

注:UIImage+YMExtension是对image做处理,因为当时主要是处理本地的图片

//UIImage+YMExtension.h

 

#import <UIKit/UIKit.h>

 

@interface UIImage (YMExtension)

 

/**

 * 返回圆形图片

 */

- (instancetype)ym_circleImage;

 

/**

 * 通过图片名,返回圆形图片

 */

+ (instancetype)ym_circleImageWith:(NSString *)name;

 

@end

 

//UIImage+YMExtension.m

 

#import "UIImage+YMExtension.h"

 

@implementation UIImage (YMExtension)

 

- (instancetype)ym_circleImage

{

    //开启图形上下文

    UIGraphicsBeginImageContext(self.size);

    

    //上下文

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    //添加一个圆

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

    CGContextAddEllipseInRect(ctx, rect);

    

    //裁剪

    CGContextClip(ctx);

    

    //绘制图片

    [self drawInRect:rect];

    

    //获得图片

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    

    //关闭图形上下文

    UIGraphicsEndImageContext();

    

    

    return image;

}

 

+ (instancetype)ym_circleImageWith:(NSString *)name

{

    return [[self imageNamed:name] ym_circleImage];

}

 

 

@end

 

 

注:下面这个类主要是处理网络加载后的图片,需要上面的类辅助,网络加载图片用的是第三方SDWebImageManager

 

//UIImageView+YMExtension.h

 

#import <UIKit/UIKit.h>

 

@interface UIImageView (YMExtension)

 

/**

 * 返回圆形图片

 */

- (void)ym_setCircleHeader:(NSString *)url placeholder:(NSString *)placeholder;

 

/**

 * 返回方形图片

 */

- (void)ym_setRectHeader:(NSString *)url placeholder:(NSString *)placeholder;

 

@end

 

 

//UIImageView+YMExtension.m

#import "UIImageView+YMExtension.h"

#import <UIImageView+WebCache.h>

 

@implementation UIImageView (YMExtension)

 

/**

 返回圆形图片

 

 @param url 图片url

 @param placeholder 占位图

 */

- (void)ym_setCircleHeader:(NSString *)url placeholder:(NSString *)placeholder

{

    //设置占位图片(如果不设置这个方法,那么图片如果加载失败,图片是方形而不是圆形)

    UIImage *placeHolder = [UIImage ym_circleImageWith:placeholder];

    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeHolder completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {

        

        //如果图片加载失败则返回(如果空占位图片有效)

        if (image == nil) {

            return ;

        }

        //返回圆形图片

        self.image = [image ym_circleImage];

    }];

}

 

 

/**

 返回方形图片

 

 @param url 图片url

 @param placeholder 占位图

 */

- (void)ym_setRectHeader:(NSString *)url placeholder:(NSString *)placeholder

{

    UIImage *placeHoder = [UIImage imageNamed:placeholder];

    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeHoder];

}

 

 

@end

原文地址:https://www.cnblogs.com/ljj-Andrew-519/p/7139588.html