通过拖动IOS在两点之间绘制一条直线

时间:2013-03-08 14:18:29

标签: iphone ios drawrect

我的UIVIew中有两张方形图像。一旦我将手指从一个图像拖到另一个图像,我想在它们之间绘制一条直线。

我已经处理touchesMoved方法来检查我的 touchLocation 何时到达任一图片的帧。所以我已经处理了的逻辑部分,当开始绘图时,在两点之间。

我只是想弄清楚如何使用(void)drawRect:(CGRect)rect来做到这一点。首先,我在drawRect中添加了一个NSlog,我编写了代码在两行之间画一条线,即使没有发生。

我检查了这个question too,但我想继续在多个点之间拖动和绘制线条。

    - (void)drawRect:(CGRect)rect
{
    NSLog(@"Draw Rect Entered");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor]CGColor]);
    CGContextSetLineWidth(context, 1.0);
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, 20, 20);
    CGContextStrokePath(context);
}

2 个答案:

答案 0 :(得分:0)

要使视图更新,您需要在需要重绘的视图上调用-setNeedsDisplay-setNeedsDisplayInRect:。一旦确定需要绘制线,就应该在触摸处理程序中执行此操作。这将触发视图上的-drawRect:方法 - 您不直接调用-drawRect。有关更多信息,请阅读UIView docs。我不知道您是否希望您的行在创建后永久存在 - 如果有可能将其删除,我会向if语句添加一个-drawRect:语句,由布尔值控制,决定是否绘制这条线是不是。然后,如有必要,您可以轻松将其关闭。

根据你下面的评论,我创建了一个ivar数组,用于存储当前跟踪行的点,然后在-drawRect:中循环它们,使用Core图形函数绘制一条线段一次。这样,每次重绘都会绘制新的细分和所有以前的细分。由于CGPoint不是obj-c对象,因此您必须创建包装类或使用obj-C ++和std::vector。你也可以使用一个固定大小的C-Array,(你提到你有10个点) - 在这种情况下你必须将未使用的坐标预设为某个定义为无效的任意值(例如-500,-500)并添加如果遇到这些值,则不绘制线段的逻辑。

小点 - 我不会硬编码线坐标 - 而是可以从图像'frame属性中获取它们。这样,如果您更改图像或调整图像大小,您的代码将更具可读性并且不会中断。

答案 1 :(得分:0)

我遇到的两个问题可能导致这个问题:
1)确保在主线程上呼叫setNeedsDisplay 2)如果您正在使用多个视图,请确保使用正确的setNeedsDisplay来呼叫。{  使用一个视图很容易,忘记在父视图上调用setNeedsDisplay