2

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

任何人都可以知道为什么会出现闪烁或闪烁效果以及如何消除它。

提前致谢。

4

1 回答 1

1

与其添加数百个非常小的视图(这确实是计算密集型的),我宁愿删除折线叠加层,并在平移识别器的每次更改时添加一个包含地图上所有点的新视图(以获得更平滑的效果,您可以先添加新的,然后删除旧的)。使用您的 coordinateArray 创建包含所有点的 MKPolyline 叠加层,而不是最后两个点。您可以执行以下操作:

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

编辑:我认为问题在于地图叠加层为缩放级别的不同离散值绘制自己。在某个缩放级别上,似乎覆盖首先以较大的缩放级别绘制自身,然后以较小的缩放级别绘制(实际上是在先前绘制的覆盖上绘制)。当您尝试在此缩放级别显示诸如绘制用户平移手势的动画时,这就是叠加层不断闪烁的原因。一种可能的解决方案是使用放置在地图视图顶部的透明视图,在用户不断移动手指的同时执行绘图。只有在平移手势结束后,您才会创建一个地图叠加层,将其“固定”到地图上并清理绘图视图。重绘视图时也需要小心,因为您应该每次只指定要重绘的矩形,然后只在该矩形中重绘,因为每次重绘整个事物也会导致该视图中的闪烁。这肯定涉及更多的编码,但它应该可以工作。检查这个关于如何逐步绘制视图的问题。

于 2013-05-10T10:25:19.797 回答