美文网首页
UIImageView高效添加圆角

UIImageView高效添加圆角

作者: 三千烦恼风_eefa | 来源:发表于2020-04-17 17:39 被阅读0次

    日常添加通过layer的两个属性实现圆角

    imageView.layer.cornerRadius = CGFloat(10); 
    imageView.layer.masksToBounds = YES;
    

    缺点:
    这样处理会触发离屏渲染:GPU在当前屏幕缓冲区外新开辟一个渲染缓冲区进行工作;这样会带来额外的性能损耗,如果这样的圆角操作达到一定数量,会触发缓冲区的频繁合并和上下文的频繁切换,代价为——掉帧。

    会引发离屏渲染的操作

    1. 为图层设置遮罩 (layer.mask)
    2. 将图层的layer.masksToBounds / view.clipsToBounds属性设置为true
    3. 为图层设置阴影(layer.shadow *)
    4. 为图层设置layer.shouldRasterize=true
    5. 具有layer.cornerRadius,layer.edgeAntialiasingMask,layer.allowsEdgeAntialiasing的图层
    6. 将图层layer.allowsGroupOpacity属性设置为YES且layer.opacity小于1.0
    7. 文本(任何种类,包括UILabel,CATextLayer,Core Text等)
    8. 使用CGContext在drawRect :方法中绘制大部分情况下会导致离屏渲染,甚至仅仅是一个空的实现
    image.png

    1、圆角优化
    优化方案1:使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100,100,100,100)];
    
    imageView.image = [UIImage imageNamed:@"myImg"];
    
    //开始对imageView进行画图
    
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO,1.0);
    
    //使用贝塞尔曲线画出一个圆形图
    
    [[UIBezierPath bezierPathWithRoundedRect:imageView.boundscornerRadius:imageView.frame.size.width]addClip];
    
    [imageView drawRect:imageView.bounds];
    
    imageView.image=UIGraphicsGetImageFromCurrentImageContext();
    
    //结束画图
    
    UIGraphicsEndImageContext();
    
    [self.view addSubview:imageView];
    

    优化方案2:使用CAShapeLayer和UIBezierPath设置圆角

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    
    imageView.image = [UIImage imageNamed:@"myImg"];
    
    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];
    

    使用CAShapeLayer(属于CoreAnimation)与贝塞尔曲线可以实现不在view的drawRect(继承于CoreGraphics走的是CPU,消耗的性能较大)方法中画出一些想要的图形

    CAShapeLayer动画渲染直接提交到手机的GPU当中,相较于view的drawRect方法使用CPU渲染而言,其效率极高,能大大优化内存使用情况

    原文链接:https://www.jianshu.com/p/cff0d1b3c915

    相关文章

      网友评论

          本文标题:UIImageView高效添加圆角

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