平常在开发的时候,如果要呈现一个视图经常会用到UIView,但有时需要对这个UIView做一些工作的时候,比如设置圆角、添加动画等,又会用到UIView中的layer,layer是UIView的一个属性,是CALayer类。CALayer是什么类?与UIView有什么关系?
CALayer与UIView的关系
从苹果的文档可以看到,CALayer类负责管理图像内容(image-based content),并且可以对图像执行动画。 CALayer类直接继承自NSObject类,所以只是负责显示内容,不会对交互事件做出响应。 苹果文档中有这样一句话
For layers you create yourself, you can assign a delegate object and use that object to provide the contents of the layer dynamically and perform other tasks.
意思是你可以为自己创建的CALayer实例指定一个delegate类,并且用这个类为layer提供视图内容,这个delegate类需要实现CALayerDelegate协议。
还有一句话,如果layer是由UIView创建的,UIView会自动把自己设为layer的delegate。
If the layer object was created by a view, the view typically assigns itself as the layer’s delegate automatically
关系一下子就清楚了,CALayer是负责显示内容的、与图像显示有关的类,而UIView类本身没有显示图像的功能,但是它有个CALayer类属性layer,UIView实例通过管理自己的layer来显示内容。
layer的delegate类就是创建layer的UIView实例,UIView类实现了CALayerDelegate协议来为自己的layer提供图像内容。同时,UIView类继承自UIResponder类,所以它可以对交互事件做出响应。
关系明确了,具体view是怎么管理自己的layer的,还有待后续研究。
再来看一下UIView.h文件。UIView.h文件中对于layer这个属性的描述是这样的。
@property(nonatomic,readonly,strong) CALayer *layer;
// returns view's layer. Will always return a non-nil value. view is layer's delegate
注释中说明view是layer的delegate,这与苹果文档中的描述相符。
其他收获
在搜集与CALayer和UIView相关描述的过程中,get了一个知识点
修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画
之前有听过隐式动画,顾名思义,我猜是不用开发者手动实现的、被动触发的动画。不过从没确认过什么是隐式动画。 为此,我写了个demo确认了一下, 创建一个UIView *view,在view的layer中添加一个subLayer。然后点击某个按钮时去修改subLayer的frame和backgroundColor。 果然,神奇的一幕发生了,改动会以动画的方式呈现。这个动画是自动进行的,很神奇啊。
REFERENCE