UIImageView添加圆角的几种方法

喜欢我的可以关注收藏我的个人博客:RobberJJ

创建一个UIImageView对象:

UIImageView * poImgView = [[UIImageView alloc] init];

<h6>第一种方法</h6>

poImgView.layer.cornerRadius = poImgView.frame.size.width/2.0;
poImgView.layer.masksToBounds = YES;
(或者 poImgView.clipsToBounds = YES;)

clipsToBounds是对view的切割,masksToBounds是对layer的切割。

性能消耗:
这个是离屏渲染(off-screen-rendering),对性能消耗比较大。
fps大致在45帧左右(每个cell 做2个imageview)(正常fps是60帧,越小,用户体验越差)。

离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。由上面的一个结论视图和圆角的大小对帧率并没有什么卵影响,数量才是伤害的核心输出啊。可以知道离屏渲染耗时是发生在离屏这个动作上面,而不是渲染。为什么离屏这么耗时?原因主要有创建缓冲区和上下文切换。创建新的缓冲区代价都不算大,付出最大代价的是上下文切换。

<h6>第二种方法</h6>

CAShapeLayer *layer = [CAShapeLayer layer];  
UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:aImageView.bounds];  
layer.path = aPath.CGPath;  
poImgView.layer.mask = layer;

性能消耗:
测试fps大致在20帧左右,比方案A的消耗更大。

<h6>第三种方法</h6>

- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
    CGRect rect = (CGRect){0.f, 0.f, self.size};
    UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
    CGContextAddPath(UIGraphicsGetCurrentContext(),[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
    CGContextClip(UIGraphicsGetCurrentContext());
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

性能消耗:
这个是on-screen-rendering
相当于时时去做渲染,相比于A.B方案的离线渲染,此方法对性能消耗最低,推荐用此方案。

<h6>值得一提</h6>
第一种跟第二种方法都是比较常见的方式,但是都不推荐,对此的优化方案是是用第三种方式,但是如果非要使用第一种跟第二种,补救措施是:

self.layer.shouldRasterize = YES;  
self.layer.rasterizationScale = [UIScreen mainScreen].scale;

当shouldRasterize设成true时,layer被渲染成一个bitmap,并缓存起来,等下次使用时不会再重新去渲染了。

实现圆角本身就是在做颜色混合(blending),如果每次页面出来时都blending,消耗太大,这时shouldRasterize = yes,下次就只是简单的从渲染引擎的cache里读取那张bitmap,节约系统资源。

如果在滚动tableView时,每次都执行圆角设置,肯定会阻塞UI,设置这个将会使滑动更加流畅。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在本系列上一篇《iOS 2D Graphic(1)—— Concept 基本概念和原理》中,我们已经了解了关于iO...
    ac3阅读 6,723评论 2 11
  • 客户端的开发,无非离不开数据和展示,而展示这个方面,首当其冲的就是视图、动画的渲染,切换等等。而且在用户的使用中,...
    ttdiOS阅读 7,458评论 0 6
  • Hibernate查询方式: 1.导航对象图检索方式:根据已有对象导航到其他对象 2.OID检索:对象OID检索对...
    又是那一片天阅读 1,917评论 0 0
  • 【186】 感觉自己有千言万语想说,却都欲言又止。以前觉得,不过是高三,考不到心爱的学校,那么复读也不算什么的。...
    楠渡阅读 1,657评论 0 1
  • ‘’当火车开入这座陌生的城市,那是从来就没有见过的霓虹‘’。 从没出过远门的我怀着要去体会下不同的打工经历,也想着...
    沉香公子阅读 2,905评论 0 0