iOS: 在 MKMapView 上,无法在 MKMapTypeStandard 和 MKMapTypeMutedStandard 类型之间切换

iOS: on MKMapView, can't switch between MKMapTypeStandard and MKMapTypeMutedStandard types

我的应用程序中有一个 MKMapView,我希望用户能够切换地图类型,因此它可以是 MutedStandard、Standard、Satellite 或 Hybrid。我已经在地图视图控制器上连接了一个 UISegmentedControl 来更改地图类型。问题是,当我尝试在 MutedStandard 和 Standard 之间切换(反之亦然)时,地图视图永远不会更新!它适用于所有其他类型的更改......如果我退出并重新加载应用程序,它可以正常工作,但实时地图类型更改永远不会工作,如果它只是在 MutedStandard 和 Standard 之间。

另一件奇怪的事情是它在 iOS12 上工作正常......只是在 iOS13 上不行。

这是处理这个问题的简单代码:

- (IBAction) updateMapTypeSegmentControlValueChanged:(id)sender {
    [[NSUserDefaults standardUserDefaults] setInteger:self.segmentMapType.selectedSegmentIndex forKey:MapViewSettingsDisplayType];
    [self updateMapDisplayType];
}

- (void) updateMapDisplayType {
    NSUInteger mapType = [[NSUserDefaults standardUserDefaults] integerForKey: MapViewSettingsDisplayType];
    switch (mapType) {
        case 0:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Muted");
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;
        }
        case 1:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Standard");
            self.mapView.mapType = MKMapTypeStandard;
            break;
        }

        case 2:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Satellite");
            self.mapView.mapType = MKMapTypeSatellite;
            break;
        }
        case 3:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Hybrid");
            self.mapView.mapType = MKMapTypeHybrid;
            break;
        }
        default:
        {
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;
        }
    }
}

关于我可以尝试使这项工作成功的任何想法?我试过使用 dispatch_after 让它在 1 秒后改变类型,但这没有用。也没有调用 [mapView setNeedsDisplay]

看起来你不必退出,但如果你移动地图,你会看到从静音到标准的转变(反之亦然)。

您可以执行多种操作来触发重绘。例如,如果您在物理设备上使用 userTrackingMode of MKUserTrackingModeFollow (.follow in Swift),您会发现它更新得相当快。或者我发现如果我将其更改为卫星并立即更改为 muted/standard,您会看到更改。或者更简单,只需设置 centerCoordinate(甚至设置为当前值),您就会看到变化:

- (void) updateMapDisplayType:(int)index {
    switch (index) {
        case 0:
            self.mapView.centerCoordinate = self.mapView.centerCoordinate;
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;

        case 1:
            self.mapView.centerCoordinate = self.mapView.centerCoordinate;
            self.mapView.mapType = MKMapTypeStandard;
            break;

        case 2:
            self.mapView.mapType = MKMapTypeSatellite;
            break;

        case 3:
            self.mapView.mapType = MKMapTypeHybrid;
            break;

        default:
            self.mapView.centerCoordinate = self.mapView.centerCoordinate;
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;
    }
}

这显然只是为了解决看起来是错误的问题。我会提交错误报告。