美文网首页
iOS UIView和CALayer的区别和联系

iOS UIView和CALayer的区别和联系

作者: 搬砖的crystal | 来源:发表于2021-09-26 16:15 被阅读0次

    在 iOS 中,所有的 view 都是由一个底层的 layer 来驱动的。view 和它的 layer 之间有着紧密的联系,view 其实直接从 layer 对象中获取了绝大多数它所需要的数据。layer侧重于图形的显示,而view相当于layer的管理者。

    1.响应事件

    UIView定义

    NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, CALayerDelegate>
    

    UIView这个类中它实现了CALayerDelegate,也就是说,当系统想要去绘制图形时,这时候,View会自动调用Delegate的方法去绘制你想要的图形。

    CALayer定义

    CA_CLASS_AVAILABLE (10.5, 2.0, 9.0, 2.0)
    @interface CALayer : NSObject <NSCoding, CAMediaTiming>
    

    从UIView和CALayer的定义可以看出UIView是继承于UIResponder,而CALayer是继承于NSObject。在iOS中,UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。所以UIView可以响应事件,而CALyer则不能响应事件

    2.初始化和Frame

    一个Layer的frame是由它的anchorPoint,position,bounds,和transform共同决定的,而一个View的frame只是简单的返回Layer的frame,View的Center和Bounds只是直接返回layer对应的Position和Bounds。

    3.内容管理和绘制

    UIView主要是对显示内容的管理,而CALayer主要是对显示的绘制。

    4.隐式动画

    每个view都有一个layer,但是也有一些不依附view单独存在的layer,如CAShapelayer。它们不需要附加到view上就可以在屏幕上显示内容。

    基本上你改变一个单独的layer的任何属性的时候,都会触发一个从旧的值过渡到新值的简单动画(这就是所谓的隐式动画)。然而,如果你改变的是view中layer的同一个属性,它只会从这一帧直接跳变到下一帧。尽管两种情况中都有layer,但是当layer附加在view上时,它的默认的隐式动画的layer行为就不起作用了。

    在Core Animation编程指南的“How to Animate Layer-Backed Views” 中,对为什么会这样做出了一个解释:

    UIView默认情况下禁止了layer动画,但是在animation block中又重新启用了它们。是因为任何可动画的layer属性改变时,layer都会寻找并运行合适的action来实行这个改变。在Core Animation的专业术语中就把这样的动画统称为动作(action,或者CAAction)。

    layer 通过向它的delegate发送actionForLayer:forKey:消息来询问提供一个对应属性变化的action。delegate可以通过返回以下三者之一来进行响应:

    • 它可以返回一个动作对象,这种情况下layer将使用这个动作。
    • 它可以返回一个nil, 这样layer就会到其他地方继续寻找。
    • 它可以返回一个NSNull对象,告诉layer这里不需要执行一个动作,搜索也会就此停止。

    当layer在背后支持一个view的时候,view就是它的delegate。

    5.总结
    • 每个UIView内部都有一个CALayer在背后提供内容的绘制和显示,并且UIView的尺寸样式都由内部的Layer所提供。两者都有树状层级结构,layer内部有SubLayers,View内部有SubViews。但是Layer比View多了个AnchorPoint。
    • 在View显示的时候,UIView做为Layer的CALayerDelegate,View的显示内容取决于内部的CALayer的display。
    • CALayer是默认修改属性支持隐式动画的,在给UIView的Layer做动画的时候,View作为Layer的代理,Layer通过actionForLayer:forKey:向View请求相应的action(动画行为)。
    • layer内部维护着三分layer tree,分别是presentLayer Tree(动画树),modeLayer Tree(模型树),Render Tree (渲染树)。在做iOS动画的时候,我们修改动画的属性,在动画的其实是Layer的 resentLayer的属性值,而最终展示在界面上的其实是提供View的modelLayer。
    • 两者最明显的区别是View可以接受并处理事件,而 Layer 不可以。

    相关文章

      网友评论

          本文标题:iOS UIView和CALayer的区别和联系

          本文链接:https://www.haomeiwen.com/subject/dniqnltx.html