似乎没有那家公司比Apple更爱圆角了,事实上,圆角也会让图形/产品看起来更加无侵略性,能够带来更好的用户体验.
iOS开发中各种圆角也随处可见,最简单给控件添加圆角的方式就是给视图的layer设置corner属性了:

self.blueView.layer.cornerRadius = 5.f;
self.blueView.layer.masksToBounds = YES;

这种方式会带来两个问题:

  1. 当图片数量比较多的时候,这种添加圆角方式特别消耗性能,比如在UITableViewCell
    添加过多圆角的话,甚至会带来视觉可见的卡顿.
  2. 无法配置圆角数量(只能添加view的四个角全为圆角),无法配置某个圆角大小.
    第一个问题实际上是由于数量太多的情况下,系统会频繁的调用GPU的离屏渲染(Offscreen Rendering)机制,导致内存损耗严重.更多关于离屏渲染的详解,可以看这里,本文不多赘述.
    第二个问题,我们可以使用UIBezierPath
    来完美解决.以下是示例代码:
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.blueView.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerBottomLeft cornerRadii:CGSizeMake(20, 0)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.blueView.bounds;
maskLayer.path = maskPath.CGPath;
self.blueView.layer.mask = maskLayer;
self.blueView.layer.cornerRadius = 5.f;
self.blueView.layer.masksToBounds = YES;

想要配置某个角为圆角的话,只需要指定对应的UIRectCorner
即可

也可以采用下面这种方法 : 采取预先生成圆角图片,并缓存起来这个方法才是比较好的手段。预处理圆角图片可以在后台处理,处理完毕后缓存起来,再在主线程显示,这就避免了不必要的离屏渲染了。

self.layer.cornerRadius = 6;
self.layer.masksToBounds = YES; // 裁剪
self.layer.shouldRasterize = YES; // 缓存
self.layer.rasterizationScale = [UIScreen mainScreen].scale;

当shouldRasterize设成true时,layer被渲染成一个bitmap,并缓存起来,等下次使用时不会再重新去渲染了。实现圆角本 身就是在做颜色混合(blending),如果每次页面出来时都blending,消耗太大,这时shouldRasterize = yes,下次就只是简单的从渲染引擎的cache里读取那张bitmap,节约系统资源。

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

文/阶梯(简书作者)
原文链接:http://www.jianshu.com/p/12f995077c7b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS 圆角那些事(转)的更多相关文章

  1. 2017-04-26 ios ipv6那些事(已完美解决)

    2017-04-26 ios ipv6那些事(已完美解决)   工作单位性质属于外包公司,每天都有几十的app要提交上传至应用市场,于2017年3月份接到ios工程师反馈 Guideline 2.1 ...

  2. iOS圆角view的Swift实现(利用Core Graphics绘制)

    iOS圆角view的Swift实现(利用Core Graphics绘制) 因为app的列表用用到了圆形图片的头像,所以去探究并思考了一下这个问题.首先这个问题有两个方向的解决方案: 把图片弄成圆形的. ...

  3. 离屏渲染学习笔记 /iOS圆角性能问题

    离屏渲染学习笔记 一.概念理解 OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. O ...

  4. iOS 证书那些事

    关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一个iOS开发小白.半吊 ...

  5. 从cocos2dx源代码看android和iOS跨平台那些事

    cocos2dx一个跨移动(平板)平台的游戏引擎,支持2d和3d,基于c/c++,网上介绍多在此不详叙.我们本篇关心的是跨平台那些事,自然而然就找到platform目录.好家伙,支持的操作平台还真不少 ...

  6. 实现IOS圆角风格的列表ListView

    这段代码目前已经加在我的一个jar包androidkit中,还没发布. 适用于android1.6以上,不依赖其他jar包 使用时不需要继承这里的RoundListAdapter.只需要在你实现了Li ...

  7. iOS开发那些事-iOS6苹果地图实用开发

    在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,但是API编程接口没有太大的变化.开发人员不需要再学习很多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也同样适用于iOS5 ...

  8. iOS开发那些事-iOS应用本地化-文本信息本地化

    文本信息本地化在本地化工作中占有很大的比例.包括了:应用名称本地化.系统按钮和信息本地化,以及静态文本信息本地化. 系统按钮和信息本地化 还记得天气预报应用背后的“完成”按钮吗,它在中文环境下是“完成 ...

  9. iOS开发那些事-iOS6苹果地图有用开发

    在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,可是API编程接口没有太大的变化.开发者不须要再学习非常多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也相同适用于iOS5 ...

随机推荐

  1. 修改IE8搜索框为指定搜索引擎,如CSDN、百度知道等

    1.运行regedit打开注册表编辑器2.找到\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchScopes\3.添加新搜索项 ...

  2. MFC 操作控件数据

    在MFC中有多种获取控件数据的方法 1.GetWindowText()和SetWindowText()函数   ],ch2[],ch3[]; GetDlgItem(IDC_EDIT1)->Get ...

  3. tcpdump 抓包让wireshark来分析

    在linux下面用tcpdump 抓包非常方便, 但是抓的包要提取出来进行分析, 还是得用wireshark来过滤分析比较方便. 下面先介绍一下 TCPDUMP 的使用 例:tcpdump host ...

  4. hdu 5570 balls(期望好题)

    Problem Description There are n balls with m colors. The possibility of that the color of the i-th b ...

  5. php算法之快速排序

    /** * 快速排序 * 原理: * 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). * 最差时间复杂度 O(n*n) * ...

  6. 使用OAuth2.0访问豆瓣API

    如何计算某个用户的access_token过期时间?开发者可以通过两种方式计算:用户授权时,oauth2/access_token接口返回的expires_in值就是access_token的生命周期 ...

  7. nyoj 523 亡命逃窜 【BFS】

    亡命逃窜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 从前有个叫hck的骑士,为了救我们漂亮的公主,潜入魔王的老巢,够英雄吧.只是英雄不是这么好当的.这个可怜的娃 ...

  8. Ubuntu12.04下jamvm1.5.4+classpath-0.98成功执行 helloworld.class

    经过两天的努力,总于在ubuntu以下编译好classpath-0.98与jamvm1.5.4,并能成功的运行类文件:jamvm hellowold,当屏幕上打印出"hello world! ...

  9. WebConfig自定义节点并读取

    最近是遇到了一个需求,需要自定义WebConfig节点,然后进行读取,网上有很多博客,写的非常好,但是笔者在实现的过程中还是遇到了点问题,现在写一篇文章来总结下. 首先推荐大家看http://www. ...

  10. 根据获取Enum名获取对应的值通用方法(仅限值为int的)

    /// <summary> /// 获取枚举对应的值 /// </summary> /// <typeparam name="T">枚举类型&l ...