UIView(包括UIImageView)的圆角[倒角]效果

1、官方的方法

UIView *view;
view.layer.cornerRadius = 5.f;

View的内部若有子视图或者是label,button时,则需要

view.layer.markToBounds = yes;  //设置裁剪的效果

当只需要设置圆角半径时,性能较高;
这两句代码不推荐一起使用,设置裁剪效果,渲染会出现内存暴涨的现象。

2、UIImageView的圆角效果,其实就是对image剪切

- (UIImage *)cornerRadiusImagewithRadius:(CGFloat)radius inRect:(CGRect)rect {
    
    // UIGraphicsBeginImageContext(rect.size);
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [[UIScreen mainScreen] scale]);
    
    // 描述路径
    [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius] addClip];
    [self drawInRect:rect];
    
    UIImage *cornerRadiusImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return cornerRadiusImage;
}

// 更细致化的方法
- (UIImage *)cornerRadiusImageOnCorner:(UIRectCorner)rectCorner withRadius:(CGFloat)radius inRect:(CGRect)rect {
    
    // 创建图形上线文
    //scale肯定不是1.0,根据设备而定
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [[UIScreen mainScreen] scale]);
    
    // 描述路径
    [UIBezierPath bezierPathWithRoundedRect:rect     byRoundingCorners:rectCorner cornerRadii:CGSizeMake(radius, radius)];
    
    // 渲染到上下文中
    [self drawInRect:rect];
    
    UIImage *cornerRadiusImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return cornerRadiusImage;
}

对UIImage源照片数据进行裁剪,一般写成UIImage的Category。

3、普通UIView及其子类的自定义圆角效果

- (void)roundOnCorner:(UIRectCorner)rectCorner radius:(float)radius {
    
    UIBezierPath *maskPath = [UIBezierPath
                              bezierPathWithRoundedRect:self.bounds
                                      byRoundingCorners:rectCorner
                                            cornerRadii:CGSizeMake(radius, radius)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    [self.layer setMask:maskLayer];
}

此方法应写在UIView的Category中,不能写在UIView的drawRect方法中,否则会易造成内存暴涨。

你可能感兴趣的:(UIView(包括UIImageView)的圆角[倒角]效果)