自iOS 13起,替换MKPolyline会导致MKTileOverlay在地图上闪烁

时间:2019-12-26 21:32:15

标签: ios mkmapview ios13 mkpolyline

我有一个MKMapView和一个MKTileOverlay,因此我可以显示“开放街道地图”图块:

NSString *templateURL = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png";
self.tileOverlay = [[MKTileOverlay alloc] initWithURLTemplate:templateURL];
self.tileOverlay.canReplaceMapContent = YES;
[self.mapView addOverlay:self.tileOverlay level:MKOverlayLevelAboveLabels];

我还想显示一个从我当前位置到库比蒂诺苹果公园的MKPolyline。此折线需要在移动时进行更新,并且由于MKPolyline对象是不可变的,因此我必须将其删除并为每次位置更新添加它:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray*)locations {

    self.currentLocation = userLocation;

    // Update polyline
    CLLocationCoordinate2D applePark = CLLocationCoordinate2DMake(37.334626, -122.008895);
    [self buildPolylineWithDestinationLocation:applePark];

}

- (void)buildPolylineWithDestinationLocation:(CLLocationCoordinate2D)coordinate {

    // Remove the polyline each time so we can redraw it
    if (self.polylineApple) {
        [self.mapView removeOverlay:self.polylineApple];
    }

    // Get current location
    CLLocation *location = self.currentLocation;
    CLLocationCoordinate2D currentLocation = location.coordinate;
    CLLocationCoordinate2D points[2];
    points[0] = currentLocation;
    points[1] = coordinate;

    // Remove all route polylines
    MKPolyline *oldPolyline = self.polylineApple;

    // Draw a line
    self.polylineApple = [MKPolyline polylineWithCoordinates:points count:2];

    [self.mapView addOverlay:self.polylineApple];
    if (oldPolyline) {
        [self.mapView removeOverlay:oldPolyline];
        oldPolyline = nil;
    }

}

问题是,这过去在旧版本的iOS中效果很好,但是自iOS 13以来,这导致每次MKPolyline删除和添加时都会重新绘制图块:

enter image description here

这仅仅是iOS 13的错误,还是我需要在代码中修复某些问题才能使之不再发生?

1 个答案:

答案 0 :(得分:0)

从iOS 8开始,我已经知道了这个问题。并非总是如此,但有时。

此问题与两件事有关:

1)每秒删除并再次添加多义线的操作将要求MKMapView用多义线重绘零件,结果是下面的MKTileOverlay。

2)如果图块的大小(以KB为单位,而不是分辨率)较小,则可能不存在问题。

我能给您的最好建议是,将自己的视图添加到MKMapView并通过调用setNeedsDisplay来更新此视图。它将触发draw方法,您可以在其中将地图点(纬度,经度)转换为屏幕点并绘制线。

编辑:一个有关MKTileOverlay重载问题的链接

https://forums.developer.apple.com/message/313677#313677