iOS中图片圆角处理

方法一:

使用layer

1
2
_imageView.clipsToBounds=YES;
_imageView.layer.cornerRadius=4.0;

效果:在图片较多的TableView里面,卡顿现象较明显,原因是离屏幕渲染消耗性能

方法二:

贝塞尔曲线”切割”个这个图片,实现UIImage的扩展,将原图裁剪成圆角

将方法定义在image类扩展中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(UIImage *)roundedCornerImageWithCornerRadius:(CGFloat)cornerRadius{
CGFloat w = self.size.width;
CGFloat h = self.size.width;
CGFloat scale = [UIScreen mainScreen].scale;
//防止圆角半径小于0,或者大于宽/高中较小的一半
if (cornerRadius < 0) {
cornerRadius = 0;
}else if (cornerRadius > MIN(w, h)){
cornerRadius = MIN(w, h)/2.;
}
UIImage *image = nil;
CGRect imageFrame = CGRectMake(0., 0., w, h);
UIGraphicsBeginImageContextWithOptions(self.size, NO, scale);
[[UIBezierPath bezierPathWithRoundedRect:imageFrame cornerRadius:cornerRadius] addClip];
[self drawInRect:imageFrame];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

方法使用
image.image = [image roundedCornerImageWithCornerRadius:100];
效果:在IPhone5s IPhone6上效果好一些,但是在IPhone6s上效果不太明显

方法三:

将方法定义在图片剪切中,给当前image绘制圆角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(UIImage *)roundedCornerImageWithCornerRadius:(CGFloat)cornerRadius{
CGFloat w = self.size.width;
CGFloat h = self.size.width;
CGFloat scale = [UIScreen mainScreen].scale;
//防止圆角半径小于0,或者大于宽/高中较小的一半
if (cornerRadius < 0) {
cornerRadius = 0;
}else if (cornerRadius > MIN(w, h)){
cornerRadius = MIN(w, h)/2.;
}
UIImage *image = nil;
CGRect imageFrame = CGRectMake(0., 0., w, h);
UIGraphicsBeginImageContextWithOptions(self.size, NO, scale);
[[UIBezierPath bezierPathWithRoundedRect:imageFrame cornerRadius:cornerRadius] addClip];
[self drawInRect:imageFrame];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

方法使用
image.image = [image roundedCornerImageWithCornerRadius:100];
效果:效果较为明显,卡顿现象基本感觉不到

方法四:

通过绘图技术来实现,给当前image绘制圆角
将方法定义在image类扩展中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (UIImage *)circleImage {
// 开始图形上下文
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
// 获得图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 设置一个范围
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// 根据一个rect创建一个椭圆
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 将原照片画到图形上下文
[self drawInRect:rect];
// 从上下文上获取剪裁后的照片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 关闭上下文
UIGraphicsEndImageContext();
return newImage;
}

使用:

1
UIImage *placeHolder = [[UIImage imageNamed:@"defaultUserIcon"] circleImage];

效果:
drawRect方法依赖Core Graphics框架来进行自定义的绘制

缺点:它处理touch事件时每次按钮被点击后,都会用setNeddsDisplay进行强制重绘;而且不止一次,每次单点事件触发两次执行。这样的话从性能的角度来说,对CPU和内存来说都是欠佳的。特别是如果在我们的界面上有多个这样的UIButton实例,那就会很糟糕了