我的应用程序中有一个基本的地图视图,其中包含一组用户可定义的航点。加载视图时,我绘制一条连接路点的路径。这很有效。
但是,当用户在视图周围拖动一个方向点时,我希望它重新绘制路径,这是我的问题。我不知道如何在第一次之后让它画出任何东西。这是我的代码:
- (void)drawRect:(CGRect)rect { ////// works perfectly
context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1, 0, 1, .7);
CGContextSetLineWidth(context, 20.0);
WaypointViewController *w = [arrayOfWaypoints objectAtIndex:0];
CGPoint startPoint = w.view.center;
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
for (int i = 1; i<[arrayOfWaypoints count]; i++) {
WaypointViewController *w2 = [arrayOfWaypoints objectAtIndex:i];
CGPoint nextPoint = w2.view.center;
CGContextAddLineToPoint(context,nextPoint.x, nextPoint.y);
}
CGContextStrokePath(context);
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if (moving) {
UITouch *touch = [touches anyObject];
currentWaypoint.view.center = [touch locationInView:self];
[delegate setUserInteraction:NO];
[self drawInContext:context];
[NSThread detachNewThreadSelector:@selector(drawInContext:) toTarget:self withObject:nil];
}
}
- (void)drawInContext:(CGContextRef)context { ///gets called, but does nothing
CGContextSetRGBStrokeColor(context, 1, 0, 1, .7);
CGContextSetLineWidth(context, 20.0);
WaypointViewController *w = [arrayOfWaypoints objectAtIndex:0];
CGPoint startPoint = w.view.center;
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
for (int i = 1; i<[arrayOfWaypoints count]; i++) {
WaypointViewController *w2 = [arrayOfWaypoints objectAtIndex:i];
CGPoint nextPoint = w2.view.center;
CGContextAddLineToPoint(context,nextPoint.x, nextPoint.y);
}
CGContextStrokePath(context);
}
答案 0 :(得分:4)
您无法在其他任何地方使用drawRect:
中处于活动状态的上下文。
而不是致电[self drawInContext:context]
来电[self setNeedsDisplay]
您在drawRect:
中指向的上下文可能会被释放,或者您可能仍然处于活动状态,但是无论哪种方式都无法将您放入该上下文的位置放到屏幕上
另外,请阅读关于在iOS here
上绘图的文档答案 1 :(得分:2)
在drawRect:
返回后,您可能无法保存上下文。您需要做的是调用[self setNeedsDisplay]
(或setNeedsDisplayInRect:
,如果您可以确定更改的边界矩形),这将导致系统再次为您调用drawRect:
。
答案 2 :(得分:0)
你只能在drawRect中完成所有绘图...希望这有助于...因此 - (void)drawInContext:(CGContextRef)上下文将无法进行任何绘制。如果在用户的触摸动作之后,你需要做一些重绘,那么你需要在你的touch方法中调用[self setNeedsDisplay]。