【问题标题】:Animating the drawing of a line programatically using Quartz 2d on IOS在 IOS 上使用 Quartz 2d 以编程方式绘制线条的动画
【发布时间】:2010-12-21 10:28:32
【问题描述】:

我正在尝试使用 Quartz 2d 绘制一条动画生长线,方法是随着时间的推移逐渐向现有线添加点。我开始绘制一条新线,在 UIView 的 drawRect 方法中,通过获取 CGContextRef,设置其绘制属性,并将第一个点移动到 (0,0)。

CGContextRef context= UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context,[UIColor blueColor].CGColor);
CGContextSetLineWidth(context, 2);
CGContextMoveToPoint(context,0,0);

稍后,在我的下一个 drawRect 调用中,我尝试再次扩展该线,获得 CGContextRef,并为其添加一个新点。

GContextRef context= UIGraphicsGetCurrentContext();
CGContextAddLineToPoint(context,x,y);

但当前的 CGContextRef 似乎没有任何我上次调用 drawRect 的 CGContextMoveToPoint 命令的记录,因此没有任何我已经开始画线的参考。

我在这里做错了吗?有没有办法引用已经绘制的线?

【问题讨论】:

  • 谢谢,我很惊讶 Apple 的文档没有包含任何对该特定行为的引用,就像它很明显......

标签: ios objective-c path quartz-graphics cgcontext


【解决方案1】:

您基本上需要将每次调用drawRect 视为从头开始。即使只要求您更新视图的子区域,您也应该假设与图形上下文相关的任何状态,例如绘图位置和颜色,都将被重置。因此,在您的情况下,您需要跟踪起始位置并每次重绘整条线。

【讨论】:

  • 这不是非常优化的方法,因为我认为这种方法不应该用作“绘图循环”。
【解决方案2】:

我认为更好的方法是为一些薄的 UIView 设置动画。看我的回答here
如果您需要的不仅仅是水平线,请旋转该视图。我认为这对性能更好。

【讨论】:

  • 您不仅对最佳策略有误——滥用视图层次结构很少是绘制东西的正确方法——您似乎也错过了问题的重点......
  • 是的,你说得对,我没抓住重点(。你觉得你的回答对解决这个问题也有好处吗problem?我以为我不应该太频繁地重绘?我会删除这个答案。
  • 你不应该太频繁地重绘,但你也不能不频繁地重绘。你也许可以得到其他东西来为你绘图——比如视图——但绘图仍然必须进行。视图代码可能会或可能不会比您自己编写的代码优化得更好,但这取决于它的设计用途与您试图用它做的事情之间的契合程度。 (续...)
  • 一般情况下,您必须选择自己绘制什么以及遵循 UIView 等系统组件绘制什么。在一种极端情况下,您可以显式地绘制整个 UI 并执行所有事件发送等;另一方面,您最终可以通过为每个彩色像素使用不同的 1x1 UIView 来绘制图像。实际上,您通常会希望找到一种快乐的媒介(尽管值得注意的是图形游戏通常倾向于前一种方法)。确切的位置因问题而异(以及编码人员的习惯)。 (...)
  • 对于所指出的问题,您的 UIView 方法可能有意义,但这取决于上下文。 (当然,额外的上下文是 OP 想要 进行显式 Quartz2D 绘图。)如果这发生在一个主要由系统 UI 组件组成的表单中,没有其他自定义绘图,那么让视图线路合理。但是,例如,如果您正在绘制一个由许多线条和形状组成的图表,以对应于您正在创建或维护的某些数据,则您不应该这样做。 (...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多