通过循环 drawRect 动画自定义贝塞尔路径
Posted
技术标签:
【中文标题】通过循环 drawRect 动画自定义贝塞尔路径【英文标题】:Animating custom Bezier paths by looping drawRect 【发布时间】:2013-10-17 07:00:28 【问题描述】:我有自定义绘图代码,它使用贝塞尔路径、渐变和笔触来执行我的绘图。我想通过循环 drawRect 并更改贝塞尔路径上的属性值来运行自定义动画。
我已经研究过使用 CAShapeLayer (UIView animation in drawrect),但这似乎对我来说并不合适。我的绘图代码非常复杂,有几百行,所有的绘图都是通过贝塞尔路径和渐变完成的。将绘图更改为 CAShapeLayer,然后为其添加颜色和渐变将非常耗时!
我知道 Apple 不建议显式调用 drawRect 而是使用 setNeedsDisplay 调用 draw rect (How to use DrawRect correctly)。但是这样做的问题是我每次都会在动画中体验到细微的差异(尽管非常微小)。这可能与 setNeedsDisplay 安排在运行循环上调用 drawRect 但本身不直接调用它有关。
我想知道我可以使用哪些策略来循环 drawRect 并实现每次同步的完美定时动画。可以这样做吗?
【问题讨论】:
【参考方案1】:Animating Pie Slices Using a Custom CALayer 和 Animating Custom Layer Properties by Rob Napier 都是学习如何在 drawInContext:
中进行完全自定义绘图时制作自定义动画的两个很好的资源。
如果你仍然觉得设置外部机制来同步绘图那么我建议你看看CADisplayLink
。
【讨论】:
所以我假设我可以将绘图封装在 CALayer 中(在 drawInContext 中)并使用 CABasicAnimations 根据图层中的哪些属性进行动画更改?也许使用 displayLink 中的 timeSinceLastDraw 来同步动画?这是一个好方法吗? 是的。我相信您可以将这两个资源中的代码调整为您的自定义绘图。 Core Animation 是您应该用于***动画的框架。 谢谢!我以前看过馅饼片教程,但 Rob 的教程真的很有帮助。会试一试的!以上是关于通过循环 drawRect 动画自定义贝塞尔路径的主要内容,如果未能解决你的问题,请参考以下文章
自定义控件三部曲之绘图篇——Path之贝赛尔曲线和手势轨迹水波纹效果