CGContextRef處理圓形圖片

  • 作項目的時候常常遇到過自定義cell,就拿朋友圈來講,用戶的頭像也是要切圓形的,一般都是在cell裏將imageView的layer作處理,像這樣

UIImageView *imageView = [[UIImageView alloc] init];
imageView.layer.cornerRadius = 10;
imageView.layer.masksToBounds = YES;複製代碼
  • 那麼問題來了,這個layer是系統封裝好的消耗的內存會相對比較大,只以一兩個imageView是很難測出來,在多個須要處理的imageView時候MJ也推薦用圖形上下文去處理,我本身去測試過,寫一個自定義TableViewCell,添加子類控件UIImageView,用兩種方法對比,layer和圖形上下文切的圓形圖,開始是加載20個tableVIewCell,內存消耗沒有多在區別,後來加到幾百個的時候內存消耗就有點明顯了。

//UIImage+YMExtension.h
 
#import <UIKit/UIKit.h>
 
@interface UIImage (YMExtension)
 
/**
 * 返回圓形圖片
 */
- (instancetype)ym_circleImage;
 
/**
 * 經過圖片名,返回圓形圖片
 */
+ (instancetype)ym_circleImageWith:(NSString *)name;
 
@end

複製代碼

#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
複製代碼
相關文章
相關標籤/搜索