美文网首页
iOS 几种圆角处理方式

iOS 几种圆角处理方式

作者: 爱编程真是太好了啦 | 来源:发表于2020-07-08 09:52 被阅读0次

1.通过设置layer的属性

-最简单的一种,但是很影响性能

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
 imageView.image = [UIImage imageNamed:@"test.png"];
 imageView.clipsToBounds = YES;
 imageView.layer.cornerRadius = 50;
 [self.view addSubview:imageView];

Core Graphics方式

-用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100,100,100)];
    
    imageView.image = [UIImage imageNamed:@"test.png"];
    
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO,1.0);
    
    [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.frame.size.width] addClip];
    
    [imageView drawRect:imageView.bounds];
    
    imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    [self.view addSubview:imageView];

CAShapeLayer 方式

-用CAShapeLayer与贝塞尔曲线(个人认为内存的消耗最少,而且渲染快速,因为实现不在view的drawRect方法中画出图形,CAShapeLayer动画渲染直接提交GPU当中,相较于view的drawRect方法使用CPU渲染而言,其效率高,能大大优化内存使用)

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    imageView.image = [UIImage imageNamed:@"test.png"];
    
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imageView.bounds.size];
    
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
    
    maskLayer.frame = imageView.bounds;
    
    maskLayer.path = maskPath.CGPath;
    
    imageView.layer.mask = maskLayer;
    
    [self.view addSubview:imageView];

重点推荐看一看YYImage的方法(功能强大的 iOS 图像框架)

- (UIImage *)yy_imageByRoundCornerRadius:(CGFloat)radius corners:(UIRectCorner)corners
                             borderWidth:(CGFloat)borderWidth
                             borderColor:(UIColor *)borderColor borderLineJoin:(CGLineJoin)borderLineJoin {

    if (corners != UIRectCornerAllCorners) {

        UIRectCorner tmp = 0;

        if (corners & UIRectCornerTopLeft) tmp |= UIRectCornerBottomLeft;

        if (corners & UIRectCornerTopRight) tmp |= UIRectCornerBottomRight; if (corners & UIRectCornerBottomLeft) tmp |= UIRectCornerTopLeft;

        if (corners & UIRectCornerBottomRight) tmp |= UIRectCornerTopRight; corners = tmp;

    }

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); CGContextRef context = UIGraphicsGetCurrentContext();

    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); CGContextScaleCTM(context, 1, -1); CGContextTranslateCTM(context, 0, -rect.size.height);

    CGFloat minSize = MIN(self.size.width, self.size.height); if (borderWidth < minSize / 2) {

        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(rect, borderWidth, borderWidth) byRoundingCorners:corners cornerRadii:CGSizeMake(radius, borderWidth)];

        [path closePath];

        CGContextSaveGState(context);

        [path addClip];

        CGContextDrawImage(context, rect, self.CGImage); CGContextRestoreGState(context);

    }

    if (borderColor && borderWidth < minSize / 2 && borderWidth > 0) {

        CGFloat strokeInset = (floor(borderWidth * self.scale) + 0.5) / self.scale;

        CGRect strokeRect = CGRectInset(rect, strokeInset, strokeInset);
 
        CGFloat strokeRadius = radius > self.scale / 2 ? radius - self.scale / 2 : 0;

        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:strokeRect byRoundingCorners:corners cornerRadii:CGSizeMake(strokeRadius,borderWidth)];

        [path closePath];

        path.lineWidth = borderWidth;
    
        path.lineJoinStyle = borderLineJoin;
    
        [borderColor setStroke];
    }
}

相关文章

网友评论

      本文标题:iOS 几种圆角处理方式

      本文链接:https://www.haomeiwen.com/subject/nkeqcktx.html