iOS中图片圆角处理

方法一:

使用layer

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

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

方法二:

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

将方法定义在image类扩展中

-(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绘制圆角

-(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类扩展中

- (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;
}

使用:

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

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

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

你可能感兴趣的:(iOS中图片圆角处理)