美文网首页
如何高性能的给 UIImageView 加个圆角?

如何高性能的给 UIImageView 加个圆角?

作者: 逆光少年 | 来源:发表于2017-09-13 11:58 被阅读163次
    • 不好的解决方案:使用下面的方式会强制Core Animation提前渲染屏幕的离屏绘制, 而离屏绘制就会给性能带来负面影响,会有卡顿的现象出现。
    self.view.layer.cornerRadius = 5.0f;
    self.view.layer.masksToBounds = YES;
    
    • 正确的解决方案:使用绘图技术
    - (UIImage*)imageAddCornerWithRadius:(CGFloat)radius andSize:(CGSize)size{
        CGRect rect = CGRectMake(0, 0, size.width, size.height);
        
        UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(radius, radius)];
        CGContextAddPath(ctx,path.CGPath);
        CGContextClip(ctx);
        [self drawInRect:rect];
        CGContextDrawPath(ctx, kCGPathFillStroke);
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    
    注意点:

    1.离屏渲染并非由设置圆角导致的!
    2.虽然设置 masksToBounds 会导致离屏渲染,从而影响性能,但是这个影响到底会有多大?在我的 iPhone6 上,即使出现了 17 个带有圆角的视图,滑动时的帧数依然在 58 - 59 fps 左右波动。
    3.在百度上看到给imageView设置圆角用了下面的这个方法

    let maskPath = UIBezierPath(roundedRect: rect,
                                    byRoundingCorners: .AllCorners,
                                    cornerRadii: CGSize(width: 3, height: 3))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = maskPath.CGPath
        self.layer.mask = maskLayer
    

    这种方法本质上是用遮罩层 mask 来实现,因此同样无可避免的会导致离屏渲染。

    参考资料:http://www.cocoachina.com/ios/20160301/15486.html

    相关文章

      网友评论

          本文标题:如何高性能的给 UIImageView 加个圆角?

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