使用CALayer或者drawRect方法来绘制自定义View

转载 2015年07月06日 23:21:24

如下图,使用CALayer和drawRect两种方式创建两个完全一样的进度条(CALayer的进度条自动会有动画)。

3个按钮分别是减少值,改变颜色和增加值。


对于使用CALayer自定义控件的实现,一些外观方面的属性定义可以直接修改对应layer的属性,比如颜色。其次,属性变化需调用setNeedsLayout方法,而主要规划逻辑也定义在UIView的layoutSubviews方法中,通常是对CALayer位置(frame属性)的重新设置。

对于使用drawRect方法实现的自定义控件,则需要使用Quartz 2D中的函数来手动执行绘画。而任何属性变化则需要调用UIView的setNeedsDisplay方法从而重新间接调用drawRect方法来刷新控件(用户不可以直接调用drawRect方法来刷新控件)。

两种方法比较,使用CALayer实现相比使用drawRect方法通常更具优势,原因1:CALayer的属性变化默认会有动画。原因2:CALayer的属性变化本身就是实时的,所以有些操作可以不必要调用setNeedsLayout方法。而使用drawRect方法实现的话,唯一的刷新方法就是通过setNeedsDisplay方法来重新刷新下自己。因此,如果自定义控件可以使用CALayer实现,最好就用CALayer,如果不可以,则不得不使用drawRect来手动绘画了。

两种方法实现进度条的代码

网盘下载:http://pan.baidu.com/s/1mgwUUqW

另外,github上有一个使用CALayer来绘制曲线动画的例子,可以窥见CALayer实现是多么简单。

https://github.com/kevinzhow/PNChart

相关文章推荐

XIB或者storyboard中嵌入自定义view(xib)的方法

转载于:StoryBoard导入Xib的自定义UIView 经常使用Xib制作自定义的UITableViewCell, 有两个神器我爱不释手, 一个是Xib另外一个是Autolayout. 于是...

自定义View—使用clipPath或者BitmapShader实现圆角图片

实现圆角图片的方式有三种,上篇文章中是使用了Xfermode,这篇文章则将总结剩下的两种clipPath、BitmapShader。这里我们跟上一篇一样继承自ImageView。公共部分无论是使用哪种...

java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)

生活中的每一刻,不管是正经历着怎样的挣扎与挑战,或许我们都只有一个选择,虽然痛苦,却依然要快乐,并相信未来...

java基础—自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存(java集合三)

人生,就是一点一滴拼凑的,生活中的很多烦恼,就是源于我们不能体谅,过分在意了自己的主张,互不理解,互不相让,伤了彼此的心...

java 集合 HashMap 重写hashCode() equals()方法来存放自定义类对象

import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import java.util.Se...

一个流行且实用的JS表单验证提示,演示了怎么自定义错误信息的显示方式,同时通过写FormValid.showError类方法来实现错误显示方式自定义: errMsg 是一个错误消息的数组,这样方便自定

表单验证提示效果 body{ color:#666666; font-size:12px} h1{ font-size:20px;} input{ border:#999999 1px so...

android——仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

转载请注明出处: www.cnblogs.com/shoneworn 我这里只是简单的用了两个listview来实现的,先上效果图。比较粗糙。预留了自定义的空间。 思路: 从上图应该可以看的出来。就...

自定义View(三)的常用方法(测量、绘制、位置)

更多内容可参考        (一)自定义View的分类点击打开链接        (二)自定义View的构造方法及自定义属性点击打开链接        (三)自定义View的常用方法(测量、绘制、位...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用CALayer或者drawRect方法来绘制自定义View
举报原因:
原因补充:

(最多只允许输入30个字)