我正在尝试使用叠加层MKMapView
在MKOverlay
上随意跟踪路线。
每次当我们移动手指时,我使用新坐标的最后一个坐标延伸折线,所有都工作正常,除非延伸折线覆盖整个覆盖在设备中闪烁(仅有时),所以我可以,跟踪问题
我试过的代码如下。
- (void)viewDidLoad
{
j=0;
coords1 = malloc(2* sizeof(CLLocationCoordinate2D));
coordinatearray=[[NSMutableArray alloc]init];
UIPanGestureRecognizer *GestureRecogonized = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(gestureDetacted:)];
[self.myMapView addGestureRecognizer:GestureRecogonized];
}
- (void)gestureDetacted:(UIPanGestureRecognizer *)recognizer
{
if(UIGestureRecognizerStateBegan==recognizer.state)
{
CGPoint point = [recognizer locationInView:self.myMapView];
CLLocationCoordinate2D tapPoint = [self.myMapView convertPoint:point toCoordinateFromView:self.view];
CLLocation *curLocation = [[CLLocation alloc] initWithLatitude:tapPoint.latitude longitude:tapPoint.longitude];
[coordinatearray addObject:curLocation];
}
coords1[0]=[[coordinatearray objectAtIndex:j] coordinate];
if(UIGestureRecognizerStateChanged==recognizer.state)
{
j++;
CGPoint point = [recognizer locationInView:self.myMapView];
CLLocationCoordinate2D tapPoint = [self.myMapView convertPoint:point toCoordinateFromView:self.view];
CLLocation *curLocation = [[CLLocation alloc] initWithLatitude:tapPoint.latitude longitude:tapPoint.longitude];
[coordinatearray addObject:curLocation];
coords1[1]=CLLocationCoordinate2DMake(tapPoint.latitude,tapPoint.longitude);
polyLine = [MKPolyline polylineWithCoordinates:coords1 count:2];
[self.myMapView addOverlay:polyLine];
}
}
覆盖委托中的
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay {
if([overlay isKindOfClass:[MKPolyline class]]){
MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay];
polylineView.strokeColor = [UIColor orangeColor];
polylineView.lineWidth = 20;
polylineView.fillColor=[[UIColor orangeColor] colorWithAlphaComponent:.1];
return polylineView;
}
}
任何人都可以知道为什么会出现闪烁或闪烁效果以及如何将其删除。
提前致谢。
答案 0 :(得分:1)
不是添加数百个非常小的视图(这实际上是计算密集型),我宁愿删除折线叠加层,并在平移识别器的每次更改时添加一个新的带有地图上所有点的新视图(对于a更顺畅的效果,你可以先添加新的,然后删除旧的)。使用coordinateArray创建包含所有点的MKPolyline叠加层,而不是最后2个点。 你可以这样做:
[coordinatearray addObject:curLocation];;
CLLocationCoordinate2D* coordArray = malloc(sizeof(CLLocationCoordinate2D)*[coordinatearray count]);
memcpy(coordArray, self.coordinates, sizeof(CLLocationCoordinate2D)*([coordinatearray count]-1));
coordArray[[coordinatearray count]-1] = curLocation;
free(self.coordinates);
self.coordinates = coordArray;
MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordArray count:[coordinatearray count]];
MKPolyline *old = [[self.mapView overlays] lastObject];
[self.mapView addOverlay:polyline];
[self.mapView removeOverlay:old];
其中self.coordinate是CLLocationCoordinate2D *类型的属性,这样你可以将现有数组memcpy到一个新数组(memcpy真的很有效)并且只需要将最后一个点添加到数组中,而不是必须循环通过NSArray *coordinatearray
的每个点。
您还必须更改if(UIGestureRecognizerStateBegan==recognizer.state)
部分,以便在第一个点击点添加self.coordinates。
就像这样:
self.coordinates = malloc(sizeof(CLLocationCoordinate2D));
self.coordinates[0] = curLocation;
编辑:我认为问题在于地图叠加会为缩放级别的不同离散值绘制自己。在某个缩放级别,看起来叠加层首先以较大的缩放级别绘制自身,然后以较小的缩放级别绘制(实际上绘制在先前绘制的叠加层上)。当您尝试通过在此缩放级别绘制用户平移手势来显示诸如此类的动画时,这就是覆盖保持闪烁的原因。一种可能的解决方案是使用放在地图视图顶部的透明视图,在该视图中,当用户继续移动手指时执行绘图。只有在平移手势结束后,您才会创建一个地图叠加层,您可以“固定”到地图并清理绘图视图。重绘视图时也需要小心,因为每次只应指定要重绘的矩形,然后仅在该矩形中重绘,因为每次重绘整个事物也会导致此视图中的闪烁。这肯定涉及更多的编码,但它应该工作。请查看此question,了解如何逐步绘制视图。