使用Quartz 2D的简单iPhone绘图应用程序

时间:2009-08-09 10:06:47

标签: iphone drawing quartz-graphics cgcontext

我正在制作一个简单的iPhone绘图程序作为个人侧面项目。

我在子类UIView中捕获touches事件并将实际内容呈现给单独的CGLayer。每次渲染后,我调用[self setNeedsLayout]并在drawRect:方法中将CGLayer绘制到屏幕上下文中。

这一切都很好,并且可以很好地绘制矩形。但是,我只想要像许多其他iPhone应用程序一样的简单“徒手”模式。

我想这样做的方法是创建一个CGMutablePath,简单地说:

CGMutablePathRef path;
-(void)touchBegan {
    path = CGMutablePathCreate();
}
-(void)touchMoved {
    CGPathMoveToPoint(path,NULL,x,y);
    CGPathAddLineToPoint(path,NULL,x,y);

}
-(void)drawRect:(CGContextRef)context {
      CGContextBeginPath(context);
      CGContextAddPath(context,path);
      CGContextStrokePath(context);
}

然而,在绘制超过1秒后,性能会恶化。

如果不是因为可变的不透明度,我只会将每一行绘制到屏幕外的CGLayer中!不透明度低于100%会导致点在连接线条的屏幕上留下。我看过CGContextSetBlendingMode()但是我找不到答案。

有人能指出我正确的方向吗?其他iPhone应用程序能够以非常高的效率执行此操作。

2 个答案:

答案 0 :(得分:1)

问题在于CGStrokePath()当前可变路径被关闭并绘制,并且当您移动手指时会创建新路径。所以你可能最终会遇到一些触摸“会话”的路径,至少这是你的伪代码似乎做的事情。

您可以尝试在触摸开始时开始新的可变路径,当触摸移动时使用CGAddLineToPoint()并在触摸结束时使用路径(非常类似于您的伪代码显示)。但是在绘制方法中,您绘制当前可变路径的副本,并且实际可变路径仍然会延长,直到触摸结束,因此您只能获得整个触摸会话的一条路径。触摸结束后,您可以永久添加路径 - 例如,您可以将所有路径放入数组中,并在draw方法中迭代它们。

答案 1 :(得分:1)

SanHolo所说的 - 加上你可能想要限制点数的增加,所以它只会增加一个新点而不是每10毫秒,比如说(你需要玩间隔)。你可以用一个简单的计时器来做到这一点。

另外,你如何指导它需要重绘自己的观点?您可能也想要限制它 - 它可能比捕获点更长的时间间隔(例如捕获点不超过每10毫秒,并且重绘不超过每200毫秒 - 再次您需要使用数字)

在这两种情况下,您都需要确保,如果没有任何事情发生的时间超过捕获最后一个点的时间间隔,或者请求重绘。这就是计时器的用武之地。