在我的应用中,我在用户的水龙头上绘制一个圆圈并拖动。他们敲击的地方是圆圈的中心,当它们拖动时,半径就达到他们的手指。一旦你绘制一个圆圈,如果你点击几次(没有拖动),没有任何反应,但下次你点击并拖动时,在你之前制作的每个水龙头上创建圆圈(与最后一个圆圈相同的圆圈) 。这对我来说没有意义,因为我在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上。
答案 0 :(得分:1)
您不能自己调用绘图程序。当系统准备好你的绘图时,必须调用它们 - 它通过调用你的drawRect:
来表示它已经准备就绪。你可以从那里运行你喜欢的任何绘图程序。您向系统表明,您有setNeedsDisplay
准备就绪后需要立即绘制的内容。这就是为什么touchesMoved:
导致绘制圆圈的原因。在setNeedsDisplay
中添加对touchesEnded:
的来电,您应该会看到您正在寻找的结果。
答案 1 :(得分:0)
嗯,[self setNeedsDisplay];
中只有touchesMoved:
,这意味着如果您只点按,则视图不会重绘。您不会在touchesEnded:
上重绘。这就解释了部分行为。
至于其余部分,我会设置断点或NSLog来调试实际发生的事情。