使用CAShapeLayer有以下一些优点

  • 渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多。

  • 高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存。

  • 不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通CALayer一样被剪裁掉。

  • 不会出现像素化。当你给CAShapeLayer做3D变换时,它不像一个有寄宿图的普通图层一样变得像素化。

关于CAShapeLayer和DrawRect的比较

  • CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性。但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义。

  • -(void)drawRect:(CGRect)rect{} 只是一个方法而已,是UIView的方法,重写此方法可以完成我们的绘制图形功能。

  • DrawRect:DrawRect属于CoreGraphic框架,占用CPU,消耗性能大。

  • CAShapeLayer:CAShapeLayer属于CoreAnimation框架,通过GPU来渲染图形,节省性能。动画渲染直接提交给手机GPU,不消耗内。

CAShapeLayer与UIBezierPath的关系

  • CAShapeLayer中shape代表形状的意思,所以需要形状才能生效。

  • 贝塞尔曲线可以创建基于矢量的路径,而UIBezierPath类是对CGPathRef的封装。

  • 贝塞尔曲线给CAShapeLayer提供路径,CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以绘制出了Shape。

  • 用于CAShapeLayer的贝塞尔曲线作为path,其path是一个首尾相连接的闭环曲线,即使该贝塞尔曲线不是一个闭环的曲线。

CAShapeLayer与CALayer

  • 普通CALayer在被初始化的时候是需要给一个frame的值的,这个frame值一般都与给定view的bounds值一致,它本身是有形状的,而且是矩形。

  • CAShapeLayer初始化时也需要指定frame值,但它本身没有形状,它的形状来源于其属性path。

  • CAShapeLayer有不同于CALayer的属性,它从CALayer继承而来的属性在绘制时是不起作用的。

CAShapeLayer有着几点很重要

  • CAShapeLayer依附于一个给定的path,必须给与path,而且,即使path不完整也会自动首尾相接。

  • CAShapeLayer属性:strokeStart以及strokeEnd代表着在这个path中所占用的百分比。

  • CAShapeLayer动画仅仅限于沿着边缘的动画效果,它实现不了填充效果。

CAShapeLayer对象属性列表

属性名 描述
path CGPathRef 对象,图形边线路径
lineWidth 边线的宽度
strokeColor 边线的颜色
lineDashPattern

设置边线的样式,默认为实线,该数组为一个NSNumber数组,数组中的数值依次表示虚线中,单个线的长度,和空白的长度,

如:数组@[2,2,3,4] 表示 有长度为2的线,长度为2的空白,长度为3的线,长度为4的空白 不断循环后组成的虚线。

如图:

lineDashPhase 边线样式的起始位置,即,如果lineDashPattern设置为@[2,2,3,4],lineDashPhase即为第一个长度为2的线的起始位置
lineCap 线终点的样式,默认 kCALineCapButt  kCAlineCapRound  kCALineCapSquare
lineJoin 线拐点处的样式,默认 kCALineJoinMiter  kCALineJoinRound  kCALineJoinBevel
strokeStart strokeEnd CGFloat类型,[0,1] 表示画边线的起点和终点(即在路径上的百分比)
fillColor CGColorRef对象,图形填充色,默认为黑色

转载于:https://www.cnblogs.com/chrisbin/p/6391933.html

iOS学习:CAShapeLayer与DrawRect对比,与UIBezierPath画图形相关推荐

  1. iOS通过CAShapeLayer和UIBezierPath画环形进度条

    UIBezierPath可以绘制矢量路径,而CAShapeLayer是Layer的子类,可以在屏幕进行绘制,本文主要思想是:CAShapeLayer按照UIBezierPath的矢量路径进行绘制. 效 ...

  2. ios学习 准备列表

    2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...

  3. iOS学习——核心动画之Layer基础

    iOS学习--核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  4. iOS -- 学习资料总结(转载)

    先著名转载地址:https://www.jianshu.com/p/c47c24ab1e76/ 关于iOS学习进阶的必读一些博客总结 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱, ...

  5. iOS学习——Quartz2D学习之UIKit绘制

    iOS学习--Quartz2D学习之UIKit绘制 1.总述 在IOS中绘图技术主要包括:UIKit.Quartz 2D.Core Animation和OpenGL ES.其中Core Animati ...

  6. 关于iOS学习进阶的必读一些博客总结

    关于iOS学习进阶的必读一些博客总结 作者 Raybon_lee 2016.01.16 22:28* 字数 3110 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱,但是后期会慢慢增 ...

  7. 使用CAShapeLayer与UIBezierPath画出想要的图形

    使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 步骤: 1.新建UIBezierPath对象bezierPath 2.新建CAS ...

  8. ios开发 方形到圆的动画_使用UIBezierPath画个圆动画

    UIBezierPath主要用来绘制矢量图形,它是基于Core Graphics对CGPathRef数据类型和path绘图属性的一个封装,所以是需要图形上下文的(CGContextRef),所以一般U ...

  9. ios学习--iphone开发笔记和技巧总结(原址持续更新)

    ios学习--iphone开发笔记和技巧总结(原址持续更新) 分类: ios Object-C2012-04-18 10:16 2716人阅读 评论(1) 收藏 举报 uiviewiphonelist ...

最新文章

  1. JAVA面试题(part2)--位运算符
  2. matlab显示曲线图中某个点的坐标值
  3. 图象:sine(正弦)、cosine(余弦)与Tangent(正切)
  4. 信息学奥赛C++语言:滔滔吃苹果
  5. 经理必看的8个管理网站
  6. python函数的内涵_python内涵段子文章爬取
  7. ionic4 ios打开appstore 跳转第三方app
  8. 【白皮书】中国高端制造投融资白皮书.pdf(附下载链接)
  9. 实体类在set字段时报空指针异常
  10. Windows核心编程_设置Windows开机自动登录
  11. socket端口重定向(python示例)
  12. 如何优雅地根治null值引起的Bug?!
  13. pandas 日期比较大小_计算pandas Dataframe中的日期时间差异
  14. [实战]200类鸟类细粒度图像分类
  15. 服务器系统有哪些,各有什么特点?
  16. 常用域名管理后台网址
  17. 什么是动态页空间?什么静态空间?
  18. Python3.8+win7
  19. MRT批处理 MODIS影像
  20. python手机壁纸高清_python爬取手机壁纸

热门文章

  1. Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
  2. 关于Arcgis工作空间的记忆点
  3. for循环优化_昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了
  4. php极差平级,平行志愿有级差吗志愿极差是什么
  5. 3d饼图 vue_怎么实现一个3d翻书效果
  6. C#-JSON的序列化和反序列化
  7. 渗透测试入门6之权限提升
  8. Java基础---代码块和final关键字
  9. JavaScript简介---JS基础
  10. React Native (一) react-native-video实现音乐播放器和进度条的功能