Swift笔记47:UIView 和 CALayer

构建用户界面,UIViewCALayer 是两个核心概念。

1. 依赖关系
  • UIViewCALayer 之间存在相互依赖的关系。每个 UIView 内部都有一个对应的 CALayer,作为其内容的呈现载体。UIView 依赖 CALayer 来绘制和显示内容,而 CALayer 依赖 UIView 提供的容器环境来展示这些内容。
  • 代理关系:UIView 实现了 CALayerDelegate 协议,这意味着当系统需要绘制 CALayer 的内容时,实际上是 UIView 在幕后调用相关方法进行绘制。这种设计使得开发者可以在 UIView 的上下文中定制内容绘制逻辑,同时利用 CALayer 的高效渲染能力。
2 框架和继承
  • 两者所属的框架不同:UIView属于UIKit框架,而CALayerQuartzCore框架下
  • UIView 继承自 UIResponder,在UIResponder中定义了处理各种事件的事件传递接口。因此它可以响应触摸、手势、键盘输入等各种用户交互事件,并通过委托、通知或闭包等方式将事件传递给应用程序逻辑进行处理。
  • CALayer直接继承NSObject,并没有相应的处理事件接口。
3 属性和方法:
  • UIView:包含许多与用户界面和事件处理相关的方法和属性,如 addSubview:、backgroundColor、frame、bounds 等。 UIView 的视觉属性(如背景色、边框等)实际上是对内部 CALayer 相关属性的封装。set/get UIView 的这些属性时,实际上是在更改或者获取 CALayer 的对应属性。UIView 提供了诸如 draw(_:) 方法(或 layoutSubviews())供子类重写,以便自定义内容的绘制。它还负责在内容或属性变化时更新其关联的 CALayer,确保界面显示的准确性。
  • CALayer:提供与图形直接相关的属性,例如 contents(图形内容)、borderWidth、shadowOpacity 和 cornerRadius 等。一个CALayer的frame是由它的anchorPoint(锚点),position,bounds,和transform共同决定。CALayer 负责内容的实际绘制,可以填充图片、使用 Core Graphics 绘制图形,或通过 contentsGravitymask 等属性控制内容的显示方式。CALayer 提供了一系列属性来控制视觉表现,如背景色、边框、圆角、阴影、透明度、变换(如旋转、缩放)、滤镜效果等。修改这些属性可以即时改变视图的外观,且通常支持硬件加速。
4 层级结构
  • UIView 是一个面向对象的控件,具有层级结构。可以在其中嵌套其他 UIView,形成视图层次。每个视图都可以响应触摸事件,形成响应者链。
    CALayer 也有类似的层次结构,即子层(sublayers)的概念。UIView 的子视图与其对应的 CALayer 子层之间有一一对应关系。它可以包含在视图中,但不能独立显示(需要依附于 UIView)。
  • Layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer
5 动画
  • CALayer 支持基于 Core Animation 的简单且高性能的动画。通过修改其属性并结合 CABasicAnimationCAKeyframeAnimationCATransaction 等动画类,可以轻松实现平移、旋转、缩放、颜色渐变等动画效果。

核心动画的特点
1.核心动画只作用在layer
2.核心动画看到的都是假象,他并没有去修改UIView的真实位置.其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer
3.当不需要与用户进行交互,使用核心动画
4.当要根据路径做动画时,使用核心动画
5.当做转场动画时,使用核心动画(转场类型比较多)

  • 隐式动画
    CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)
    每个view都有一个layer,但是有一些不依附view单独存在的layer,如CAShapelayer,它们不需要附加到view上就可以在屏幕上显示内容。
    基本上我们改变一个layer的任何一个属性时,都会触发一个从旧值到新值的简单动画,这就是所谓的隐式动画。但是,当layer附加到view中时,这个隐式动画就不起作用了。
    UIView默认情况下禁止了layer动画,但是在animation block中又重新启用了它们。因为任何可动画的layer属性改变时,layer都会寻找并运行合适的action来实行这个改变,这个动画在Core Animation中就是CAAction。
    layer通过向它的delegate发送actionForLayer:forKey:消息来询问提供一个对应属性变化的action。
5 响应链与生命周期
  • UIView 集成了完整的响应链和视图生命周期管理,包括加载、布局、显示、隐藏、销毁等阶段。相比之下,CALayer 的生命周期相对简单,主要关注内容绘制和视觉效果。
6 性能
  • 在渲染复杂界面时,使用 CALayer 进行直接的图形操作可以提供更高的性能。UIView 的交互和事件处理会涉及更多的开销。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容