iOS – UIView和CALayer的关系

CALayer 主要负责显示内容,继承自 NSObject

UIView 主要对 CALayer 做了简单的封装(UIView 类中有个成员变量 layer 就是 CALayer 类型)。另外,UIView 继承自 UIResponder 类,所以也会负责处理触摸事件的响应。

  • UIView 部分源码如下
open class UIView : UIResponder, NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate {

    open class var layerClass: AnyClass { get }

    public init(frame: CGRect)

    public init?(coder: NSCoder)

    open var isUserInteractionEnabled: Bool

    open var tag: Int

    open var layer: CALayer { get }

    @available(iOS 9.0, *)
    open var canBecomeFocused: Bool { get }

    @available(iOS 9.0, *)
    open var isFocused: Bool { get }

    @available(iOS 9.0, *)
    open var semanticContentAttribute: UISemanticContentAttribute

    ......
}

当对一个视图进行绘制的时候,绘图单元会向 CALayer 索取要显示元素的相关数据,此时, CALayer 会通过 delegate 通知到 UIView,看看 UIView 是否有提供需要绘制的元素。如果 UIView 什么都不需要提供的话,就当作无视。