【问题标题】:How do I use CALayer with the iPhone?如何在 iPhone 上使用 CALayer?
【发布时间】:2008-11-03 10:37:15
【问题描述】:

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

我目前通过将 UIView“向上”移动 2 个像素(实际上是 UIImageView)然后绘制下一个“行”来对此进行动画处理。

使用多个 CALayer 层会加快渲染此动画的性能吗?

是否有使用 CALayer 和 iPhone SDK 的教程、示例应用程序或代码 sn-ps?

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

【问题讨论】:

    标签: iphone core-animation


    【解决方案1】:

    好的,好吧,如果你想要一些 CA good 的好例子,可以绘制类似的东西并在手机上运行,​​我推荐 Jens Aflke 发布的 GeekGameBoard 代码(它是一些 Apple 的改进版本演示代码)。

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

    【讨论】:

      【解决方案2】:

      您看到哪些 CALayer 方法在 iPhone 上不起作用?除了与 CoreImage 相关的动画功能外,我还没有注意到缺少多少。您可能会注意到的一件大事是所有视图都是图层支持的(因此您不需要做任何特殊的事情来使用图层,您可以通过图层访问器方法获取 UIView 的图层),并且坐标系有一个顶部左原点。

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

      话虽如此,通常层比视图更轻,所以如果你有很多单独的元素需要保持逻辑分离,你会发现移动到层可能比使用视图更胜一筹。

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

      【讨论】:

        【解决方案3】:

        您看到哪些 CALayer 方法在 iPhone 上不起作用?

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

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

        现在,我有一个自定义的UIView,我覆盖了其中的drawRect 方法。在drawRect 中,我抓取一个上下文并渲染两种类型的CGLayerRefs:

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

        在“on”单元格处,我在 320x480 像素的网格(初始化)或 320x2 的行(动画)上绘制一个 CGLayerRef

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

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

        1. 如果 CALayer 的开销比我现在做的要少,让我的渲染速度更快
        2. 让我的动画更流畅,让我在屏幕上平滑过渡一个图层

        不幸的是,我目前似乎无法让基本的 CALayer 工作,也没有找到大量示例代码可供查看和使用。

        【讨论】:

          猜你喜欢
          • 2010-11-29
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 2011-04-10
          • 2011-01-17
          • 1970-01-01
          • 2017-01-11
          • 1970-01-01
          相关资源
          最近更新 更多