如何在iPhone上使用CALayer?

时间:2008-11-03 10:37:15

标签: iphone core-animation

目前,我有一个UIView子类,可以在屏幕上“标记”单个2px x 2px CGLayerRef,最多160 x 240次。

我目前通过将UIView“向上”移动屏幕2像素(实际上是UIImageView)然后绘制下一个“行”来设置动画。

使用多个CALayer图层会加快呈现此动画的效果吗?

是否有教程,示例应用程序或代码片段用于使用iPhone SDK的CALayer?

我问的原因是我发现的大多数代码片段都演示了CALayer的简单示例,它使用了不适用于iPhone SDK的方法调用。我感谢任何建议或指示。

3 个答案:

答案 0 :(得分:4)

好吧,好吧,如果你想要一些有很好的CA好例子来吸引那样的东西并在手机上工作,我推荐Jens Aflke发布的GeekGameBoard代码(它是改进版的一些Apple演示代码)。

根据你所描述的内容,我认为你做的事情比它需要的更复杂。我的印象是你基本上想要一个静态视图,你通过改变它的位置来动画,使它部分偏离屏幕。如果你只需要在drawRect中设置一些静态内容,那么通过图层调用CGFillRect()并不会比用你的颜色更快。之后,你可以在UIView上使用隐式动画和动画代理来移动视图。我怀疑你甚至可以摆脱自定义的drawRect:带有图案UIColor的实现,但老实说我没有对这两者之间的差异进行基准测试。

答案 1 :(得分:3)

您看到哪些CALayer方法无法在iPhone上运行?除了与CoreImage绑定的动画功能之外,我没有注意到很多缺失。您可能会注意到的最重要的事情是所有视图都是图层支持的(因此您不需要做任何特殊的事情来使用图层,您可以通过图层访问器方法获取UIView的图层),并且坐标系统具有顶部离开原点。

无论如何,通常拥有更多的东西比拥有更少的东西要慢。如果您只是一遍又一遍地重复相同的模式,您可能会发现最佳性能是实现一个知道如何绘制所需内容的自定义UIView / CALayer / UIColor,而不是将视觉上相同的层或视图放在彼此旁边

话虽如此,通常图层的重量比视图要轻,所以如果你需要保持逻辑上分离的很多单独的元素,你会发现移动到图层可以赢得使用视图。

您可能需要查看 - [UIColor initWithPatternImage:],具体取决于您要执行的操作。如果你使用这两个像素图案作为背景颜色,你可以制作一个绘制它并设置背景的UIColor。

答案 2 :(得分:1)

您看到哪些CALayer方法无法在iPhone上运行?

作为一个例子,我尝试实现网格演示here,没有太多运气。看起来CAConstraintLayoutManagerCAConstraintQuartzCore.h中不可用。

在另一次尝试中,我尝试了一个非常简单的小型20x20 CALayer对象作为我UIView图层属性的子图层,但没有显示。

现在,我有一个自定义UIView,我覆盖了drawRect方法。在drawRect中,我抓住了一个上下文并渲染了两种CGLayerRef s:

在“关闭”单元格中,我在整个320x480画布上绘制背景色。

在“on”单元格上,我要么在一个320x480像素(初始化)的网格上绘制一个CGLayerRef,要么在320x2行(动画)上绘制。{/ p>

在动画期间,我从320x478像素制作UIImageView剪辑视图,并绘制一行。这会将我的位图一次“推”出屏幕两个像素。

基本上,我想测试使用CALayer是否会完成两件事:

  1. 如果CALayer的开销低于我现在正在做的
  2. ,我的渲染速度会更快
  3. 让我顺利地在屏幕上过渡图层,让我的动画更流畅
  4. 不幸的是,我似乎无法让基本的CALayer工作,并且还没有找到很多样本代码来查看和使用。