如下图,使用CALayer
和drawRect
两种方式创建两个完全一样的进度条(CALayer
的进度条自动会有动画)。
3个按钮分别是减少值,改变颜色和增加值。
对于使用CALayer
自定义控件的实现,一些外观方面的属性定义可以直接修改对应CALayer
的属性,比如颜色。其次,属性变化需调用setNeedsLayout
方法,而主要规划逻辑也定义在UIView
的layoutSubviews
方法中,通常是对CALayer
位置(frame属性)的重新设置。
对于使用drawRect
方法实现的自定义控件,则需要使用Quartz 2D中的函数来手动执行绘画。而任何属性变化则需要调用UIView
的setNeedsDisplay
方法从而重新间接调用drawRect
方法来刷新控件(用户不可以直接调用drawRect
方法来刷新控件)。
两种方法比较,使用CALayer
实现相比使用drawRect
方法通常更具优势,原因1:CALayer
的属性变化默认会有动画。原因2:CALayer
的属性变化本身就是实时的,所以有些操作可以不必要调用setNeedsLayout
方法。而使用drawRect
方法实现的话,唯一的刷新方法就是通过setNeedsDisplay
方法来重新刷新下自己。因此,如果自定义控件可以使用CALayer
实现,最好就用CALayer
,如果不可以,则不得不使用drawRect
来手动绘画了。