画的时候不应该......?

时间:2013-12-01 02:26:20

标签: ios objective-c cocoa-touch uiview drawrect

在我的应用中,我在用户的水龙头上绘制一个圆圈并拖动。他们敲击的地方是圆圈的中心,当它们拖动时,半径就达到他们的手指。一旦你绘制一个圆圈,如果你点击几次(没有拖动),没有任何反应,但下次你点击并拖动时,在你之前制作的每个水龙头上创建圆圈(与最后一个圆圈相同的圆圈) 。这对我来说没有意义,因为我在touchesBegan:withEvent上调用的唯一内容是

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

每次都应该更换中心,但是当你最后移动手指时,它会在每个水龙头处绘制一个单独的圆圈。

touchesMoved:

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

distance = (uses center's attributes);

[self setNeedsDisplay];

touchesEnded:

[self drawBitmap];

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,为什么我在touchesEnd时看不到圆圈?这只是我看到的拖动事件。 编辑要清楚,我不希望在单个点击上绘制所有的圈子,只在drags上。

2 个答案:

答案 0 :(得分:1)

您不能自己调用​​绘图程序。当系统准备好你的绘图时,必须调用它们 - 它通过调用你的drawRect:来表示它已经准备就绪。你可以从那里运行你喜欢的任何绘图程序。您向系统表明,您有setNeedsDisplay准备就绪后需要立即绘制的内容。这就是为什么touchesMoved:导致绘制圆圈的原因。在setNeedsDisplay中添加对touchesEnded:的来电,您应该会看到您正在寻找的结果。

答案 1 :(得分:0)

嗯,[self setNeedsDisplay];中只有touchesMoved:,这意味着如果您只点按,则视图不会重绘。您不会在touchesEnded:上重绘。这就解释了部分行为。

至于其余部分,我会设置断点或NSLog来调试实际发生的事情。