我正在尝试跟踪用户的路线和路线图,但是addOverlay仅给我正确的点,但每个点之间没有连接。

-(void)viewWillAppear:(BOOL)animated{
    self.trackPointArray = [[NSMutableArray alloc] init];
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(CLLocation *)userLocation
{
    [self.trackPointArray addObject:userLocation];

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1000, 1000);
    [self.myMapView setRegion:[self.myMapView regionThatFits:region] animated:YES];

    NSInteger stepsNumber = self.trackPointArray.count;

    CLLocationCoordinate2D coordinates[stepsNumber];
    for (NSInteger index = 0; index < stepsNumber; index++) {
        CLLocation *location = [self.trackPointArray objectAtIndex:index];
        coordinates[index] = [location coordinate];
    }
    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:stepsNumber];
    [self.myMapView addOverlay:polyLine];
}


- (MKOverlayRenderer *)mapView:(MKMapView *)myMapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolylineRenderer *polylineRenderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
    polylineRenderer.lineWidth = 4.0f;
    polylineRenderer.strokeColor = [UIColor redColor];
    return polylineRenderer;
}

最佳答案

map 视图传递给userLocation委托方法的didUpdateUserLocation对象每次都是相同的对象。

对象内部的coordinate随时可能有所不同,但是对委托方法的每次调用始终指向相同的容器对象。

具体来说,它始终指向 map 视图的userLocation属性指向的同一对象(mapView.userLocation)。如果您使用NSLog userLocationmapView.userLocation并看到它们的内存地址每次相同,则可以看到此信息。

因此,当代码执行此操作时:

[self.trackPointArray addObject:userLocation];

它只是多次将相同的对象引用添加到数组。

稍后,当代码循环遍历trackPointArray数组时,每次对[location coordinate]的调用都会返回相同的坐标,因为location始终指向同一对象(mapView.userLocation),并且在循环期间坐标不会更改。

因此,每次调用委托方法时,都会使用N个坐标(全部相同)创建一条折线,最后绘制一个“点”。

您看到多个点的原因是因为代码没有删除以前的叠加层。

要解决所有这些问题,一种简单的方法是每次要添加更新的坐标时都创建一个新的CLLocation实例:
CLLocation *tpLocation = [[CLLocation alloc]
                           initWithLatitude:userLocation.coordinate.latitude
                           longitude:userLocation.coordinate.longitude];
[self.trackPointArray addObject:tpLocation];

此外,在添加更新的行之前,应删除以前的覆盖图。如果您不这样做,您将不会注意到前几行,但是它们会耗尽内存和性能:
[self.myMapView removeOverlays:self.myMapView.overlays];
[self.myMapView addOverlay:polyLine];

关于ios - MKPolyline仅绘制点而不是线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26506407/

10-12 04:02