iOS:我应该为动画添加UIView还是CALayer?

7
假设我想向视图添加50张图片以便对它们进行动画处理。并且假设我计划使用核心动画(例如CABasicAnimation)而不是“UIView”动画。
在实现时,将子视图或子层添加50个哪种方式更好?有区别吗?
谢谢。
4个回答

17

如我在这里所述,我在动画中使用过UIView和CALayer,并发现它们之间的性能差异可以忽略不计。UIView是层的轻量级包装器,而且任何基于层的动画都可以很容易地应用于UIView的后备层。

我在直接使用CALayer的情况下是想创建跨平台(Mac/iOS)UI元素,因为CALayer在两个平台上的实现几乎完全相同(不像NSView和UIView有明显不同)。CALayer默认没有触摸处理例程,但如果需要,您可以添加该功能。

还有一些边缘情况,您可能希望直接使用层,比如当尝试进行有限的3D图层操作时(比如CoverFlow效果),或者当使用CAReplicatorLayer来产生粒子效果时。


最终我选择了UIView,主要是因为在需要连续运行动画/执行操作的情况下,使用带有块的UIView动画实现起来更加容易。(这些完成块非常干净,而在我的特定情况下,使用委托'animationDidStop'调用将会是一场噩梦。) - Greg Maletic
1
@Greg - 是的,新的基于块的UIView动画非常干净。但是,您可以使用CATransaction的+setCompletionBlock:来获取类似的块完成回调,该方法将在该事务中包装的所有动画完成时执行一个块。如果您可能想要这样做,这只是需要考虑的一些事情。 - Brad Larson

1

UIViews 包含子层,因此它们的权重较大,并且包含您可能不需要的所有50个图像的事件和触摸处理程序/变量等内容。因此,对于每个图像使用层可能会比使用视图略微更高效并且使用更少的内存。


1

这么少的图片差别可以忽略不计,使用最方便的即可。


在我的实验中,我发现在 iPhone 4 上,在我动画化大约50张图像之前,会出现一些卡顿的情况。(我只能假设这个数字会因图像内容/大小、动画图像下方的半透明层数量等因素而有很大的变化。) - Greg Maletic
而且还有手机型号:D - BallpointBen

0

我还没有做过动画(但是:-),但我记得读到的东西建议创建一个包含所有50个平铺图像的图像,然后在绘制时只需偏移至正确的图像。这样,您只需要一个层或UIImage或其他内容来显示它。我不知道速度如何,但我猜它会节省内存,并且可能更容易管理和编码。


这通常被称为“精灵”,适用于OpenGL动画,但并不真正适用于CoreAnimation。 - Paul Alexander

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