iOS基础知识

UIView和Calyer

2018-09-13  本文已影响96人  雷3雷

1.首先UIView可以响应事件,Layer不可以.UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。在 UIResponder中定义了处理各种事件和事件传递的接口, 而 CALayer直接继承 NSObject,并没有相应的处理事件的接口

2.View中frame getter方法,bounds和center,UIView并没有做什么工作;它只是简单的各自调用它底层的CALayer的frame,bounds和position方法。

3.UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。

然后我在上面两个方法加了断点,可以看到如下的执行。

UIView和Calyer

可以看到 UIView 是 CALayer 的CALayerDelegate,我猜测是在代理方法内部[UIView(CALayerDelegate) drawLayer:inContext]调用 UIView 的 DrawRect方法,从而绘制出了 UIView 的内容. 可以人为view 是Calayer的代理

4.在做 iOS 动画的时候,修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画,而修改UIView则不会

CALayer动画与UIView动画的使用场合

        我本来对于CALayer动画的一些使用场合比较疑惑,可以直接用UIView块动画为什么要费心思写CALayer动画呢?所以首先,我想说一下CALayer动画与UIView动画的使用场合。

        1、UIView属于UIKit框架,属于苹果原生框架,而CALayer属于QuartzCore框架,而后者是可以跨平台的,所以当需要跨平台的时候就用CALayer动画喽。

        2、UIView可以与用户交互,而CALayer只用于展示,所以,如果需要与用户交互的动画就用UIView动画,不需要交互的,就用CALayer。

总结

总接来说就是如下几点:

每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint

在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 displayCALayer 是默认修改属性支持隐式动画的,

在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer

两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以

CATransactions 让layer 动画 完不回弹

上一篇下一篇

猜你喜欢

热点阅读