方案一:切l(wèi)ayer#
直接設(shè)置該UIImageView的layer的cornerRadius屬性(半徑)為UIImageView寬度的一半。
- (void)viewDidLoad
{
[super viewDidLoad];
_imgView.image = [UIImage imageNamed:@"1.jpg"];
_imgView.layer.cornerRadius = _imgView.frame.size.width*0.5;
_imgView.layer.masksToBounds = YES; // 超出部分裁剪掉
}
這種方式非常簡單晴裹,但是性能不太好励翼,當(dāng)有很多圖片被切為圓角后,在上下滾動的時候有些卡頓。
方案二:用Core Graphics在圓形上繪制一張圖片,并把超出部分才剪掉
// 開啟圖形上下文
UIGraphicsBeginImageContext(self.size);
// 獲得上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 矩形框
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// 畫一個圓
CGContextAddEllipseInRect(context, rect);
// 按上面圖形裁剪多余部分
CGContextClip(context);
// 將image繪制到剛才的圓形上
UIImage *image = [UIImage imageNamed:@"1.jpg"];
[image drawInRect:rect];
// 獲得上下文的圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
用上面的幾行代碼就可以實現(xiàn)圖片切圓角了泳炉,但是,為了擴展性著想嚎杨,我們應(yīng)當(dāng)將這些代碼進行封裝花鹅。封裝的這個方法我們希望:只需傳入圖片名(imgName)就返回已經(jīng)切好圓角的圖片(UIImage)。
可以新建一個UIImage的分類枫浙,在里面封裝該實現(xiàn)刨肃。
UIImage
UIImage+CycleImage.h
#import <UIKit/UIKit.h>
@interface UIImage (CycleImage)
- (UIImage *)cycleImage;
+ (UIImage *)cycleImageNamed:(NSString *)imgName;
@end
UIImage+CycleImage.m
#import "UIImage+CycleImage.h"
@implementation UIImage (CycleImage)
- (UIImage *)cycleImage
{
// 開啟圖形上下文
UIGraphicsBeginImageContext(self.size);
// 獲得上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 矩形框
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// 畫一個圓
CGContextAddEllipseInRect(context, rect);
// 裁剪成上面畫的圖形形狀
CGContextClip(context);
// 將image繪制到剛才的圓形上
// UIImage *image = [UIImage imageNamed:@"1.jpg"];
// [image drawInRect:rect];
[self drawInRect:rect];
// 獲得上下文的圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
+ (UIImage *)cycleImageNamed:(NSString *)imgName
{
return [[UIImage imageNamed:imgName] cycleImage];
}
調(diào)用:
// 圖片圓角
#import "MyViewController.h"
#import "UIImage+CycleImage.h"
@interface MyViewController ()
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_imgView.image = [UIImage cycleImageNamed:@"1.jpg"]; // 類方法
// _imgView.image = [[UIImage imageNamed:@"1.jpg"] cycleImage]; // 對象方法
}
@end