我如何在iPhone上使用CALayer?

4

目前,我有一个UIView子类,可以在屏幕上“盖章”一个2像素乘以2像素的CGLayerRef,最多160 x 240次。

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

使用多个CALayer图层能加速渲染此动画吗?

有没有使用iPhone SDK的CALayer的教程、示例应用程序或代码片段?

我之所以问这个问题,是因为我发现大多数演示CALayer简单示例的代码片段都不能在iPhone SDK中使用。我感激任何建议或指针。

3个回答

4

好的,如果你想要一些具有绘图和手机功能的优秀CA示例,我推荐Jens Aflke发布的GeekGameBoard代码(它是某个Apple演示代码的改进版本)。

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


3
你在 iPhone 上看到了哪些 CALayer 方法不起作用?除了与 CoreImage 相关的动画功能外,我没有注意到有什么缺失。你可能会注意到的主要问题是所有的视图都是层支持的(所以你不需要做任何特殊的事情来使用层,只需通过层访问器方法获取 UIView 的层),并且坐标系统具有左上角原点。
总的来说,通常拥有更多的东西比拥有更少的东西要慢。如果你只是一遍又一遍地重复相同的模式,那么最好的性能是实现一个自定义的 UIView/CALayer/UIColor,它知道如何绘制你想要的内容,而不是将视觉上相同的层或视图放在一起。
话虽如此,通常层比视图更轻量级,因此如果你有很多需要保持逻辑分离的单独元素,那么移动到层可能比使用视图更好。
根据你所尝试的具体内容,你可能需要查看-[UIColor initWithPatternImage:]。如果你将这个两个像素的模式用作背景颜色,你可以创建一个绘制它的 UIColor 并设置背景。

1

你看到的 CALayer 方法在 iPhone 上不起作用吗?

举一个例子,我试着实现这个网格演示 here,但是没有成功。好像在 QuartzCore.h 中并没有提供 CAConstraintLayoutManagerCAConstraint

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

现在,我有一个自定义的 UIView,我重写了 drawRect 方法。在 drawRect 中,我获取上下文并渲染两种类型的 CGLayerRef

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

在“打开”单元格中,我会在 320x480 像素的网格或 320x2 行上绘制一个 CGLayerRef(初始化)或跨越多行进行动画渲染。

在动画期间,我从320x478像素制作了一个UIImageView剪辑视图,并绘制了一行。这样做会使我的位图每次向上推两个像素。
基本上,我想测试使用CALayer是否能够实现两件事:
  1. 如果CALayer的开销比我现在所做的少,可以使我的渲染更快
  2. 通过让我平稳地将一个层向上过渡,使我的动画更加流畅
不幸的是,我目前似乎无法让基本的CALayer工作,并且没有找到一个好的示例代码块来查看和操作。

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