【发布时间】:2024-01-22 03:01:01
【问题描述】:
两者具有大部分相同的属性,都支持不同类型的动画,都表示不同的数据。 UIView 和 CALayer 有什么区别?
【问题讨论】:
两者具有大部分相同的属性,都支持不同类型的动画,都表示不同的数据。 UIView 和 CALayer 有什么区别?
【问题讨论】:
在 iOS 上,每个 UIView 都由 Core Animation CALayer 支持,因此在使用 UIView 时您正在处理 CALayers,即使您可能没有意识到这一点。与 Mac 上的 NSView 不同,它在 Core Animation 存在之前就已经发展起来,UIView 旨在成为这些 CALayer 周围的轻量级包装器。
正如我在类似的问题"When to use CALayer on the Mac/iPhone?" 中所描述的,直接使用 CALayers 不会给您带来比 UIViews 显着的性能优势。您可能想要使用 CALayers 而不是 UIViews 构建用户界面元素的原因之一是它可以很容易地移植到 Mac。 UIViews 与 NSViews 非常不同,但 CALayers 在两个平台上几乎相同。这就是 Core Plot 框架使用 CALayers 而不是其他 UI 元素来布置其图表的原因。
UIViews 通过 CALayers 提供的一件事是对用户交互的内置支持。如果管理 CALayers 的层次结构,它们会处理您需要自己构建的触摸和其他相关操作的命中测试。自己实现这一点并不难,但是在构建仅 CALayer 的接口时需要编写额外的代码。
在执行比基本 UIView 类允许的更复杂的动画时,您通常需要访问 UIView 的底层。 UIView 的动画功能随着 iOS SDK 的成熟而增长,但仍有一些事情最好通过与底层 CALayer 交互来完成。
【讨论】:
来自 Ray Wenderlich 博客 (Tutorial)
CALayers 只是代表屏幕上一个矩形的类 带有视觉内容。 “但是等一下,”你可能会说,“那是 UIView 是干什么用的!”这是真的,但有一个技巧: 每个 UIView 都包含一个它所绘制的根层!
【讨论】:
简单来说,UIView继承自UIResponder,处理来自用户的事件,包含CALayer,继承自NSObject,主要关注渲染、动画等。
【讨论】:
UIView 是CALayers 的容器。使用UIKit。
CALayer 我们绘制内容的地方。使用CoreGraphics
如果您使用自定义控件之类的功能,最好继续使用包含更多层的单一视图,以实现准确的原生渲染。因为CALayers 比UIView 轻。
要为 Mac 和 iOS 创建通用骨架,请使用 CALayers 为您的应用程序设计。因为它在两个平台上都可用。
UIView 具有使用委托-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event、tochesStart 类似事件和其他UIKit 功能实现的类似触摸事件的功能。
使用CALayers 使用核心图形知识。对于任何简单的视图渲染UIView 就足够了。
【讨论】:
UIView: 视图具有更复杂的层次结构布局。他们可以接收用户交互,如点击、捏合、点击等。使用 UIViews 发生在主线程上,这意味着它正在使用 CPU 能力。
CALayer:另一方面,层具有更简单的层次结构。这意味着它们可以更快地解决并更快地在屏幕上绘制。与视图不同,没有响应者链开销。图层直接在 GPU 上绘制。它发生在一个单独的线程上,不会给 CPU 带来负担。
更多详情:https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5
【讨论】:
最大的不同是 UIView 是为移动设备上的 CocoaTouch 设计的。它添加了一些 CALayer 没有提供的事件处理程序。
【讨论】: