ios - 在地图上的随机位置,多段线被随机地绘制

  显示原文与译文双语对照的内容
0 0

我正在努力计算如何在我的地图上显示线条。 我试图从接触开始画一条线。

现在我接触到我触摸的坐标,将它添加到 array,接触到触摸端的线,然后画线。 下面是我的代码。

当我运行代码时,我的代码行没有显示。 然而当我在想我丢失了什么( 。因为我的坐标被保存到 array ) 时,我一直在抖动我的屏幕,突然出现了一条线。 我关闭了程序并重新做了同样的事情,就像我所说的,线正在随机绘制,在错误的坐标。

我改变了


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;
}

enter image description here

时间: 原作者:

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 时,代码给出的地址是单个 CLLocationCoordinate2D 结构,但是 count 被设置为 arrayOfLine 中的对象数量,它最可能是两个( 触摸开始+ 触摸结束) 。

polylineWithCoordinates 方法需要一个简单的CLLocationCoordinate2D 结构的array 。

在当前的代码中将只使用单个结构,而计数告诉方法也使用内存中的字节,即在中的结构中使用字节作为坐标。 跟随 obh的字节很可以能是随机值,转换为无意义的坐标,所以你得到随机行。


要解决这个问题,你需要从 arrayOfLine ( 一个 objective-c NSArray ) 构建一个普通的C array 。
下面是一个实现这里目的的方法:


//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]];


其他一些不直接引起问题的点:
  1. touchesBegan 中,创建 obh1 是不必要的。 startTouch 已经是一个可以添加到 array的CLLocationCoordinate2D
  2. touchesEnded 中,创建 obh 是不必要的。 endTouch 已经是一个可以添加到 array的CLLocationCoordinate2D
  3. 目前 arrayOfLine 在任何地方都没有被清除。 这意味着无论什么时候触摸结束,用户绘制的所有行都被绘制为( 并连接在一起) 。 不确定意图是什么,但如果只需要绘制当前begin+end触摸对,那么在 touchesBegan 顶部,请执行 [arrayOfLine removeAllObjects];
  4. 确保 userInteractionEnabled 在地图视图上设置为 NO,否则它会干扰触摸方法并导致异常行为( 比如 touchesEnded 没有被呼叫) 。
原作者:
...