UIView与CALayer的关系 2021-01-16 前进路上 暂无评论 2606 次阅读 本文发布于2021-01-16, 文章内容或资源可能已经失效,仅供参考,谢谢。 平常在开发的时候,如果要呈现一个视图经常会用到UIView,但有时需要对这个UIView做一些工作的时候,比如设置圆角、添加动画等,又会用到UIView中的layer,layer是UIView的一个属性,是CALayer类。CALayer是什么类?与UIView有什么关系? # CALayer与UIView的关系 从苹果的[文档](https://developer.apple.com/documentation/quartzcore/calayer "文档")可以看到,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这个属性的描述是这样的。 ```objective-c @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 - [CALayer](https://developer.apple.com/documentation/quartzcore/calayer "CALayer") - [UIView](https://developer.apple.com/documentation/uikit/uiview "UIView") - [iOS 浅谈UIView 和 CAlayer](https://juejin.cn/post/6844903593682665479 "iOS 浅谈UIView 和 CAlayer") 标签: iOS开发 如果您对此页面有任何问题或建议,请在本站留言,或联系邮箱me[at]zkk.me本网站部分内容转载自其他网站,如有侵权,请联系博主