【发布时间】:2012-04-14 13:06:27
【问题描述】:
我一直在 UIView 子类中使用 drawRect 处理自定义绘图。这很酷,但是您必须等到运行循环结束才能调用 drawRect,我想知道如何控制逐帧动画,随着时间的推移更改绘图,或者这是否可能?也许 Quartz 并不是真正为这种类型的动画图形设计的?我推测它可能是为不经常变化的静态图纸设计的。
【问题讨论】:
标签: iphone ipad core-graphics quartz-2d
我一直在 UIView 子类中使用 drawRect 处理自定义绘图。这很酷,但是您必须等到运行循环结束才能调用 drawRect,我想知道如何控制逐帧动画,随着时间的推移更改绘图,或者这是否可能?也许 Quartz 并不是真正为这种类型的动画图形设计的?我推测它可能是为不经常变化的静态图纸设计的。
【问题讨论】:
标签: iphone ipad core-graphics quartz-2d
Quartz 本身无法维持高帧速率,因为它每次都需要重绘所有内容。但是你可以让 Quartz 和 CoreAnimation 一起工作来制作基于 Quartz 的动画。这背后的想法是,您可以将之前绘制的内容缓存在 CALayer 对象中,然后使用 CoreAnimation 来创建连续的绘制效果。
可以在AccelerometerGraph sample code provided by Apple 中看到这种技术的一个很好的例子。在此示例中,使用此技术的 UIView 子类是“GraphView”对象。基本上,该对象仅将图形的一部分(新生成的段)绘制为全新的,在专用层中支持它,然后为层设置动画以提供“滚动图形”动画。
显然,只有当您完全控制绘图元素并且可以管理在屏幕中添加对象的这种增量方式时,这种技术才有效。当然,当您必须重绘屏幕的许多不同部分并且需要修改先前生成的图层时,事情会变得更加复杂。
不管怎样,看看上面提到的代码:这很有趣。
【讨论】:
您的应用应在每一帧之前退出运行循环。在每帧之间进行所有自定义帧动画设置。所以 drawRect 中的逐帧绘图应该可以正常工作。这可以在 iOS 应用程序中以 60 Hz 的帧更新速率工作,而不仅仅是静态视图,只要您在帧时间之间的所有方法以及您的 drawRects 足够快。如果需要,将它们切碎。
【讨论】:
for 循环,你就不会回到它,所以你把它举起来,所以不会发生绘图。相反,您应该创建一个计时器或一个操作队列。然后,在设置好之后,你返回,运行循环会做它的事情。如果你做一个计时器,运行循环会调用它。如果你创建一个操作队列,它通常与运行循环分开运行,并会在一个或多个其他线程上调用你。