UIView动画与CALayer的比较

76

我在概念上理解 CALayer 的动画方式与 UIView 相比存在困难。再加上 "Core Animation" 的概念,或许有人可以从更高的层面解释这些概念,帮助我更好地想象发生了什么,以及为什么我想要将我现在非常熟悉的 UIView 动画迁移到 iPhone 上的 CALayer 动画中。在 Cocoa-Touch 中,每个视图都会自动获得一个图层。同时,似乎你可以动画化其中的一个或者两个?!甚至混合使用?!但是为什么呢?在哪里划分界限?使用各自方法的优缺点是什么?

Core Animation Programming Guide 立刻跳到图层和定时类,我认为需要退后一步,了解这些不同的部分为什么存在以及它们彼此之间的关系。


3
这是一个优秀的通用问题,所有回答都很好。我投票支持这个帖子中的每一个人。 - mobibob
很好的问题。有人知道为动画UIView的CALayer的最佳实践吗?在我的例子中,我需要一种三维效果,并且我发现动画层会导致UIView的“frame”与该层不对齐(因此对于按钮,触摸将不再匹配)。 - Marc
5个回答

55

使用视图控制内容,使用图层实现视觉效果。由于图层不接收事件,因此在这些情况下使用视图更容易,但是当您想要动画精灵、背景等时,使用图层就有意义了。事件会直接穿过图层传递到背景视图中,因此您可以拥有漂亮的视觉表现而无需破坏事件。如果您试图叠加一个仅用于视觉表现的视图,则必须自己将点击事件传递给底层视图。


这是一个很棒的答案。谢谢! - Warpling

26

UIView始终呈现为CALayer。当您使用UIView方法对视图进行动画处理时,实际上是在操作底层的CALayer

如果您需要进行简单操作,请使用UIView方法。对于更复杂的情况或者您想要与任何特定视图关联的图层,请使用CALayers


21

在过去的一年中,我完成了许多应用程序。 这是我的经验法则:

  1. 使用UIView,直到它不能满足你的需求。
  2. 然后转向CoreAnimation。 但在深入研究之前...
  3. 如果你要编写多个动画,请使用Cocos2D。

Cocos2D有什么更好的表现吗?除了触摸事件处理和许多在OpenGL ES中缺失的其他功能之外,您还有其他问题吗? - Thanks
Cocos2D添加了许多便捷方法,因此代码更加简洁。它们具有一些出色的内置特效。简而言之,如果您正在执行一堆动画,则使用Cocos2D编写的代码量比使用OpenGL ES或Core Animation少得多。它们有自己的触摸处理方法,所以这完全不是问题。 - Chris Garrett
13
除非你在编写游戏,否则建议不要使用Cocos2D。我认为这确实是它最好的用例。但我同意,尽可能使用UIView动画,对于更复杂的动画则应使用CoreAnimation。 - Jonathan Sterling

9

UIView的变换只能是二维的,并且受到限制。而Layer的变换可以是三维的,如果您想要进行三维操作,应该使用它们。如果更改UIView的变换或CALayer的变换,则UIView动画将起作用。因此,在基本层面上,当您使用Layer而不是View时,可以进行更多操作。


2

我不确定自己是否误解了Chris对于"What's Cocos2D doing better? Don't you have other problems then, regarding the touch event handling and many other stuff that misses in openGL ES?"的回答。

听起来这个回答暗示着Cocos2D并非基于OpenGL ES框架,而实际上它确实是。虽然它是一个很棒的2D游戏引擎,但它大部分渲染是使用OpenGL实现的-同时它还连接了一个物理库,为动画提供了很多有趣的可能性- Chris说得没错,的确少写了很多代码。


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