UIView和CALayer之间有哪些区别?

111
UIView和CALayer有很多相同的属性,都支持不同类型的动画,而且它们代表不同的数据。那么它们之间有哪些区别呢?
6个回答

240
在iOS上,每个UIView都由一个Core Animation CALayer支持,所以在使用UIView时,你实际上正在处理CALayers,即使你可能没有意识到。与Mac上的NSViews不同,这些UIView旨在成为这些CALayers轻量级的包装器,因为它们是在Core Animation存在之前演化的。
正如我在类似问题中描述的(“何时在Mac/iPhone上使用CALayer?”),直接使用CALayer与使用UIView相比没有明显的性能优势。你可能想使用CALayers构建用户界面元素的原因之一是,它可以非常容易地移植到Mac平台上。UIView与NSView非常不同,但是在两个平台上,CALayers几乎完全相同。这就是为什么Core Plot框架使用CALayers而不是其他UI元素布置其图表的原因。
UIView提供的一件事情是内置的用户交互支持。它们处理触摸和其他相关操作的命中测试,如果管理CALayer层次结构,则需要自己构建这些命中测试。实现这个并不难,但在构建仅由CALayer组成的接口时,你需要编写额外的代码。
在执行比基本的UIView类允许的更复杂的动画时,通常需要访问UIView的底层图层。随着iOS SDK的成熟,UIView的动画功能已经增强,但仍有一些最好通过与底层的CALayer交互来完成。

42

来自Ray Wenderlich博客(教程)

CALayer是代表屏幕上一个带有视觉内容的矩形的类。"但等一下,"你可能会说,“那不是UIView的工作吗!”那是对的,但这里有个诀窍:每个UIView都包含一个它绘制到的根层!


39

简单说,UIView继承自UIResponder,处理用户事件,包含CALayer,后者继承自NSObject, 主要用于渲染、动画等。


8

UIViewCALayers的容器,使用UIKit实现。

CALayer用于绘制内容,使用CoreGraphics实现。

如果您正在处理自定义控件等功能,则最好使用包含更多层的单个视图以实现精确的本地渲染。因为CALayersUIView更轻量级。

要为Mac和iOS创建通用骨架,请使用CALayers遵循应用程序的设计。因为它在两个平台上都可用。

UIView具有像触摸事件这样的特性,使用委托-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event,类似于tochesStart事件和其他UIKit功能。

要使用CALayers,请使用Core Graphics知识。对于任何简单的视图渲染,UIView就足够了。


4

UIView:视图具有更复杂的层次结构布局,可以接收用户交互,如点击、捏合、单击等。与UIView的工作发生在主线程上,这意味着它正在使用CPU计算能力。

CALayer:另一方面,层具有更简单的层次结构,这意味着它们解析速度更快,绘制在屏幕上更快。不像视图那样存在响应链开销。层直接在GPU上绘制,这会在分离的线程上进行,而不会加重CPU负担。

了解更多详情: https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5


0

UIView 和 CALayer 的最大区别在于,UIView 是为移动设备上的 CocoaTouch 设计的。它添加了一些事件处理程序,而 CALayer 没有提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接