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;
}
}
这显然只是为了解决看起来是错误的问题。我会提交错误报告。
我的应用程序中有一个 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;
}
}
这显然只是为了解决看起来是错误的问题。我会提交错误报告。