使用iPhone手指绘制直线

5

背景:我正在尝试创建一个非常简单的iPhone应用程序,允许用户使用手指在屏幕上绘制多条直线。

我在我的UIViewController中使用这两种方法来捕获每条线段端点的坐标。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
问题: 我希望当touchesEnded触发时,直线能够立即显示,并在屏幕上继续绘制更多直线。我该如何做到这一点?我不需要代码,但我需要关于如何组合它的大体想法。此外,如果不使用xibs,我喜欢完全以编程方式完成任务,如果这影响答案,请告诉我。 我尝试过的: 我尝试使用Quartz 2d,但似乎必须在一个单独的子类视图的drawRect方法中进行绘制。所以我每条直线都要创建一个新视图?然后我的坐标会混乱,因为我必须将touches位置从UIViewController转换到视图中。
我还尝试了OpenGL,使用GLPaint样本作为模板,我取得了一些进展,但OpenGL似乎对于仅在屏幕上绘制一些直线来说有些过度。

实际上,OpenGL对于这个问题来说有些过度了,除非你真的需要它,否则最好不要去碰它。对于这样一个易于阅读的问题,给一个赞,如果其他人也能做到这一点就好了... - Pochi
3个回答

3
您不需要多个视图,也不需要OpenGL。
创建一个UIView的子类--命名为CanvasView
在您的画布中创建一个表示“一条线”的对象--它应该是NSObject的子类,并具有用于开始和结束的CGPoint属性。 CanvasView应该保留包含在画布中的线条的数组。
-[CanvasView drawRect:]中,循环遍历数组中的线条,并绘制每一条线。
-[CanvasView touchesBegan:withEvent:]中,将起始点储存在实例变量中。 在-[CanvasView touchesEnded:withEvent:]中,使用起点和终点创建新线,并将其添加到您的线条数组中。调用[self setNeedsDisplay]来导致视图重新绘制。

如果用户有很多行,这种方法不会变慢吗?使用Quartz的绘图器方法不是更有效吗? - Pochi
1
这是使用“石英画家方法”的方式,因为它使用Quartz进行绘制。是的,根据线条的绘制方式,几百或几千条线后会变慢。这只是方法的基本概述,当然可以进一步优化。 - Kurt Revis

2
您提到您只需要了解这个想法的大致情况。
那么,这就是它的概述:
创建一个UIView的子类。捕获触摸事件,然后在drawRect:方法中绘制它。
这就是@kurtRevis在他的答案中提到的所有内容。
为了避免绘图变慢,保持一个离线图像来更新屏幕视图,然后只需在其上添加线条。这样,当需要绘制大量线条时,您就不会出现性能下降的情况。
希望您明白我的意思。

-1
据我所知,您也可以使用Core Graphics来绘制线条,从您的问题中可以看出,您不需要为每条线条创建视图,而是单个视图图形上下文将成为所有绘图的绘图板,您几乎接近解决方案。只需获取触摸坐标即可在视图上绘制线条。
CGPoint previousPoint;//这必须具有全局范围,在所有触摸事件中都会使用

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{       
   UITouch *touch = [touches anyObject];
   previousPoint = [touch locationInView:self]; // 获取起始触摸点;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
   CGPoint currentPoint;
   UITouch *touch = [touches anyObject];   
   currentPoint = [touch locationInView:self]; 
   CGContextRef context = UIGraphicsGetCurrentContext();
   CGContextSetLineWidth(context, 2.0);
   CGContextMoveToPoint(context, previousPoint.x,previousPoint.y);
   CGContextAddLineToPoint(context, currentPoint.x,currentPoint.y);
   CGContextStrokePath(bluecontext);
}

希望这能帮助您,如果有任何问题,请告诉我....


这样写是行不通的。你不能在 -touchesMoved:withEvent: 方法中绘制视图。如果 UIGraphicsGetCurrentContext() 返回任何有用的内容,那只是巧合。此外,你甚至没有描边路径,只是添加到当前的 CG 路径中。 - Kurt Revis

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