服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS设置圆角的4种方法实例(附性能评测)

iOS设置圆角的4种方法实例(附性能评测)

2021-05-19 18:26溪石iOS IOS

这篇文章主要给大家介绍了关于iOS设置圆角的4种方法,并给大家附上了性能评测,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

四种设置圆角的方法

从网上收集了各种设置圆角的方法,总结起来有以下四种:

1、设置 layer 的 cornerradius

?
1
2
view.layer.maskstobounds = yes;
view.layer.cornerradius = imgsize.width / 2;

2、用贝塞尔曲线作 mask 圆角

?
1
2
3
4
cashapelayer *layer = [cashapelayer layer];
uibezierpath *apath = [uibezierpath bezierpathwithovalinrect:view.bounds];
layer.path = apath.cgpath;
view.layer.mask = layer;

3、重新绘制圆角

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^{
    uiimage *image = view.image;
    image = [image drawcircleimage];
    dispatch_async(dispatch_get_main_queue(), ^{
     view.image = image;
    });
   });
////////////////////////
@implementation uiimage (roundedcorner)
 
- (uiimage *)drawcircleimage {
 cgfloat side = min(self.size.width, self.size.height);
 uigraphicsbeginimagecontextwithoptions(cgsizemake(side, side), false, [uiscreen mainscreen].scale);
 cgcontextaddpath(uigraphicsgetcurrentcontext(),
      [uibezierpath bezierpathwithovalinrect:cgrectmake(0, 0, side, side)].cgpath);
 cgcontextclip(uigraphicsgetcurrentcontext());
 cgfloat marginx = -(self.size.width - side) / 2.f;
 cgfloat marginy = -(self.size.height - side) / 2.f;
 [self drawinrect:cgrectmake(marginx, marginy, self.size.width, self.size.height)];
 cgcontextdrawpath(uigraphicsgetcurrentcontext(), kcgpathfillstroke);
 uiimage *output = uigraphicsgetimagefromcurrentimagecontext();
 uigraphicsendimagecontext();
 return output;
}
 
@end

4、混合图层,用一张镂空的透明图片作遮罩

iOS设置圆角的4种方法实例(附性能评测)
cover@2x.png

?
1
2
3
4
5
uiview *parent = [view superview];
uiimageview *cover = [[uiimageview alloc] initwithframe:cgrectmake(0, 0, imgsize.width, imgsize.height)];
cover.image = [uiimage imagenamed:@"cover"];
[parent addsubview:cover];
cover.center = view.center;

四种方法性能测试

网上流传两个结论:

  • 第一种方法会引发离屏渲染,所以是最慢的;
  • 据说第四种是效率最高的。

事实情况如何呢?

为了验证网上的结论,需要找一种性能比较的方法,这里用 instrument 的测试 fps (帧数)作为性能直观的比较值,测试过程如下:

  • 搭建collectionview 工程,连续刷新显示 1万个cell,每个cell使用相同图片,排除不同照片带来的差异;
  • 在真机下运行分别运行四种方法,用 instrument 记录,并计算平均fps;
  • 为保证平均值准确,去掉头尾帧数率过低的时间段。

iOS设置圆角的4种方法实例(附性能评测)
1. 设置 layer 的 cornerradius

iOS设置圆角的4种方法实例(附性能评测)
2. 用贝塞尔曲线作 mask 圆角

iOS设置圆角的4种方法实例(附性能评测)
3. 重新绘制圆角

iOS设置圆角的4种方法实例(附性能评测)
4. 混合图层,用一张镂空的透明图片作遮罩

结果排名如下

3 > 1 > 2 > 4

一点点优化

第四种方式不但垫底,而且出奇的慢,说明我们的实现有明显的问题,观察代码,发现原来的代码没有考虑 cell 复用,cove 视图被反复添加到cell,哪有不慢的道理!!! 于是作以下优化:

?
1
2
3
4
5
6
7
8
9
// 4. 混合图层,用一张镂空的透明图片作遮罩 (优化版)
uiview *parent = [view superview];
if (![parent viewwithtag:13]) {
 uiimageview *cover = [[uiimageview alloc] initwithframe:cgrectmake(0, 0, imgsize.width, imgsize.height)];
 cover.image = [uiimage imagenamed:@"cover"];
 cover.tag = 13;
 [parent addsubview:cover];
 cover.center = view.center;
}

这样避免了view的重复添加,fps 有了明显的回升:

iOS设置圆角的4种方法实例(附性能评测)
4.(优化版)

优化后的排名: 3 > 4 > 1 > 2

结论

测试的结论与网上流传的几乎完全不同,分析一下造成这种情况的原因:

  • 苹果在ios9后优化了 cornerradius 的绘图方式,方法1不再需要离屏渲染。
  • 方法3基于单张位图运算,方法2使用了矢量并与位图叠加,导致运算量上升,观察图2的gpu运算量高达 80.2%,证明了这一推断。

实际开发建议

  • 方法1 设置简单,性能差别不明显,简单圆角场景下推荐使用。
  • 方法4 基于透明位图,可用于异形遮罩,但需要根据图片大小做多张特殊位图,请根据实际情况选择。
  • 在位图尺寸很大,数量很多的情况下,用方法3,但要注意内存警告,最好配合缓存机制使用,避免因内存溢出而崩溃。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

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

延伸 · 阅读

精彩推荐
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28