我正在努力研究如何在地图上显示线条。我试图从触摸中划出一条线,开始触及结束。
此刻我正在接触触摸的地方的坐标,将其添加到阵列中,取出触摸结束的绳索,将其添加到阵列然后绘制线条。这是我的代码。
当我遗憾地运行代码时,我的线条没有显示。然而,当坐在想知道我错过了什么(因为我的coords被保存到阵列)时,我一直在沮丧地刷屏幕,突然出现了一条线!我关闭了程序并再次做同样的事情,据我所知,线条是随机绘制的,并且坐标错误。
我改变了
CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake
(startTouch.latitude, startTouch.longitude);
到
CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake
(startTouch.longitude, startTouch.latitude);
看看我是否以某种方式混合我的坐标,但同样的事情正在发生。线条是在随机位置绘制的。
如果有人可以帮我解决这个问题,我将不胜感激。
我做了一些工作,这就是我想出的。当我点击地图时,您会看到4个线条点。他们是接触结束,接触开始。我不知道他们来自哪里,但不知道我的代码。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches began");
UITouch *touch = [touches anyObject];
// Get the specific point that was touched
CGPoint point = [touch locationInView:self.view];
//convert toc
CLLocationCoordinate2D startTouch
=[self.map convertPoint:point toCoordinateFromView:_map];
CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake(startTouch.latitude, startTouch.longitude);
[arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh1]];
NSLog(@"array: %@", arrayOfLine);
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches END");
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
CLLocationCoordinate2D endTouch
=[self.map convertPoint:point toCoordinateFromView:_map];
CLLocationCoordinate2D obh=CLLocationCoordinate2DMake(endTouch.latitude, endTouch.longitude);
[arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh]];
NSLog(@"array: %@", arrayOfLine);
MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];
[_map addOverlay:polygon];
}
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKPolyline class]])
{
MKPolylineView *overlayView = [[MKPolylineView alloc] initWithPolyline:overlay];
overlayView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
overlayView.lineWidth = 3;
return overlayView;
}
return nil;
}
答案 0 :(得分:0)
随机行 来自相关代码。
主要问题在于本节touchesEnded
:
CLLocationCoordinate2D obh=CLLocationCoordinate2DMake(endTouch.latitude, endTouch.longitude);
[arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh]];
NSLog(@"array: %@", arrayOfLine);
MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];
在致电polylineWithCoordinates
时,代码会提供obh
的地址,这是单 CLLocationCoordinate2D
结构,但count
设置为arrayOfLine
中的对象很可能是两个(触摸开始+触摸结束)。
polylineWithCoordinates
方法期待CLLocationCoordinate2D
个结构的普通C数组。
目前,代码仅为方法提供单个结构,但计数告诉方法还使用 single 结构后面的内存中的字节作为数组中的坐标。 obh
之后的内存中的字节很可能是随机值,转换为无意义的坐标,因此您可以得到随机行或根本没有行。
要解决此问题,您需要从arrayOfLine
构建一个纯C数组(Objective-C NSArray
)。
这是一种方法:
//REPLACE this existing line with the code below:
//MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];
CLLocationCoordinate2D coords[arrayOfLine.count];
for (int c = 0; c < arrayOfLine.count; c++)
{
NSValue *v = [arrayOfLine objectAtIndex:c];
coords[c] = v.MKCoordinateValue;
}
MKPolyline *polygon = [MKPolyline polylineWithCoordinates:coords count:[arrayOfLine count]];
<小时/> 其他几点不直接导致问题:
touchesBegan
中,无需创建obh1
。 startTouch
已经是CLLocationCoordinate2D
,您可以将其添加到数组中。touchesEnded
中,无需创建obh
。 endTouch
已经是CLLocationCoordinate2D
,您可以将其添加到数组中。arrayOfLine
在任何时候都没有被清除。这意味着每当触摸结束时,用户绘制的所有行都被重新绘制(并连接在一起)。不确定目的是什么,但如果您只想绘制当前的开始和结束触摸对,那么在touchesBegan
的顶部,执行[arrayOfLine removeAllObjects];
。userInteractionEnabled
设置为NO
,否则可能会干扰触摸方式并导致奇怪的行为(例如touchesEnded
未被调用)。