Ios 不该画画的时候画画。。?

Ios 不该画画的时候画画。。?,ios,objective-c,cocoa-touch,uiview,drawrect,Ios,Objective C,Cocoa Touch,Uiview,Drawrect,在我的应用程序中,我在用户的点击和拖动上画了一个圆圈。他们敲击的地方是圆的中心,当他们拖动时,半径一直到他们的手指。绘制一个圆后,如果您在周围轻触几次(不拖动),除了下次轻触并拖动外,什么也不会发生,每次轻触都会创建圆(大小与上次创建的圆相同)。这对我来说毫无意义,因为我在touchsbegind:withEvent上调用的东西只有 UITouch *touch = [touches anyObject]; center = [touch locationInView:self]; 它每次都应

在我的应用程序中,我在用户的点击和拖动上画了一个圆圈。他们敲击的地方是圆的中心,当他们拖动时,半径一直到他们的手指。绘制一个圆后,如果您在周围轻触几次(不拖动),除了下次轻触并拖动外,什么也不会发生,每次轻触都会创建圆(大小与上次创建的圆相同)。这对我来说毫无意义,因为我在
touchsbegind:withEvent
上调用的东西只有

UITouch *touch = [touches anyObject];
center = [touch locationInView:self];
它每次都应该替换圆心,但当你最后移动手指时,它会在每次轻触时画一个单独的圆圈

触摸移动:

UITouch *touch = [touches anyObject];
endPoint = [touch locationInView:self];

distance = (uses center's attributes);

[self setNeedsDisplay];
接触:

[self drawBitmap];
绘图位图:

if (!CGPointEqualToPoint(center, CGPointZero) && !CGPointEqualToPoint(endPoint, CGPointZero)) {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);

    if (!incrementalImage) { // first draw;
        UIBezierPath *rectpath = [UIBezierPath bezierPathWithRect:self.bounds]; // enclosing bitmap by a rectangle defined by another UIBezierPath object
        [[UIColor clearColor] setFill];
        [rectpath fill]; // fill it
    }
    [incrementalImage drawAtPoint:CGPointZero];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, sW);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), r, g, b, o);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGRect rectangle = CGRectMake(center.x - distance, center.y - distance, distance * 2, distance * 2);
    CGContextAddEllipseInRect(context, rectangle);
    CGContextStrokePath(context);

    incrementalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}
drawRect

    [incrementalImage drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, sW);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), r, g, b, o);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGRect rectangle = CGRectMake(center.x - distance, center.y - distance, distance * 2, distance * 2);
    CGContextAddEllipseInRect(context, rectangle);
    CGContextStrokePath(context);

为什么轻敲后会形成圆圈,但只有在拖动时才会出现?只能在拖动时绘制圆。。。对吗?我几乎99%确定问题出在drawBitmap上,但我不确定该怎么做来检查它是否只是点击或拖动。另外,如果问题是drawBitmap,为什么触摸Send时我看不到圆圈?只有在拖动事件中我才能看到它们编辑说得很清楚,我根本不希望在单次点击时绘制圆,只希望在拖动时绘制圆。

您自己不需要调用绘制例程。当系统准备好对图形执行操作时,必须调用它们——它通过调用
drawRect:
来发出准备就绪的信号。您可以从那里运行任何您喜欢的绘图例程。使用
setNeedsDisplay
向系统指示您有需要绘制的内容。这就是为什么
touchesMoved:
会导致绘制圆圈。在
touchesend:
中添加对
setNeedsDisplay
的调用,您应该会看到您正在查找的结果。

嗯,您只有
[self-setNeedsDisplay]触摸移动:
中选择code>,这意味着如果只点击,视图将不会重新绘制。您不能在
touchesend:
上重新绘制。这就解释了部分行为


至于剩下的部分,我会设置断点或nslog来调试真正发生的事情。

对不起,应该指定这是一个覆盖drawRect的UIView子类。不管怎样,我编辑它是为了说我根本不想在一个水龙头上画圆圈。一次点击不应该只改变中心指针的值吗?不管您希望得到什么结果,根本的问题是您不能直接从
touchesend:
,只在源自
drawRect:
的调用堆栈中进行绘制,而该调用堆栈不是您直接调用的。