我们可能很多人都看过这张图,也能大概知道它们两者的关系
1.首先UIView可以响应事件,Layer不可以.
我们先来看第一个例子
如果真的是这样,那何不用CALayer去代替UIView能?所以答案很显然不是正确的。因为上述代码中的CALayer是放在self.view.layer中去,所以才拥有与UIView看似一样的属性。
我们知道在UIKit中,但凡是与UIResponder直接继承或者间接继承的类都应具有相应用户事件的能力。
下面是源文件中,对于UIView的定义,继承自UIResponder
@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, CALayerDelegate>
而我们再去比较CALayer的定义
@interface CALayer : NSObject <NSSecureCoding, CAMediaTiming>
我们发现CALayer上级类是NSObject,为一个基类。那他怎么又可能去对用户的操作做出响应呢?
那么问题来了,既然UIView可以响应事件,UIView中也有一个主CALayer,那到底怎么由怎么样一个过程来让UIView去展示用户能看到的东西的呢?
我们会发现在UIView这个类中它实现了CALayerDelegate,也就是说,当系统想要去绘制图形时,这时候,View会自动调用Delegate的方法去绘制你想要的图形。
包含以下几个方法其中 displayLayer 方法 和 drawLayer 方法如果全部实现的话只会走displayLayer,他们的执行顺序是
layerWillDraw-> displayLayer/drawLayer -> layoutSublayersOfLayer;
如果当前View 有多个Layer 的话 在这4个方法中 写的代码 会在每个layer中绘制。
具体想研究怎么个去精细地去控制这个Layer下篇文章中会详细说明。