iOS:在MKMapView上,可以';t在MKMapTypeStandard和MKMapTypeMutedStandard类型之间切换
我的应用程序中有一个MKMapView,我希望用户能够切换地图类型,因此它可以是静音标准、标准、卫星或混合。我在地图视图控制器上连接了一个UISegmentedControl来更改地图类型。问题是,当我尝试在MutedStandard和Standard之间切换时(反之亦然),地图视图永远不会更新!它适用于所有其他类型的更改。。。如果我退出并重新加载应用程序,它就可以工作,但是如果只是在静音标准和标准之间,实时地图类型的更改就永远不会工作 另一件奇怪的事情是,它在iOS12上运行良好。。。只是不在iOS13上 以下是处理此问题的简单代码:iOS:在MKMapView上,可以';t在MKMapTypeStandard和MKMapTypeMutedStandard类型之间切换,ios,mapkit,mkmapview,Ios,Mapkit,Mkmapview,我的应用程序中有一个MKMapView,我希望用户能够切换地图类型,因此它可以是静音标准、标准、卫星或混合。我在地图视图控制器上连接了一个UISegmentedControl来更改地图类型。问题是,当我尝试在MutedStandard和Standard之间切换时(反之亦然),地图视图永远不会更新!它适用于所有其他类型的更改。。。如果我退出并重新加载应用程序,它就可以工作,但是如果只是在静音标准和标准之间,实时地图类型的更改就永远不会工作 另一件奇怪的事情是,它在iOS12上运行良好。。。只是不在
- (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]
看起来您不必退出,但如果您移动地图,您将看到从静音到标准的转换(反之亦然)
你可以做很多事情来触发重画。例如,如果您在物理设备上并使用(在Swift中),您将倾向于看到它更新得相当快。或者我发现,如果我将其更改为卫星,并立即更改为静音/标准,您将看到更改。或者更简单,只需设置中心坐标
(甚至设置为其当前值),即可看到更改:
- (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;
}
}
很明显,这只是为了避开一个看起来像是bug的东西。我将提交一份错误报告。看起来您不必退出,但如果您移动地图,您将看到从静音到标准的转变(反之亦然) 你可以做很多事情来触发重画。例如,如果您在物理设备上并使用(在Swift中),您将倾向于看到它更新得相当快。或者我发现,如果我将其更改为卫星,并立即更改为静音/标准,您将看到更改。或者更简单,只需设置
中心坐标
(甚至设置为其当前值),即可看到更改:
- (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;
}
}
很明显,这只是为了避开一个看起来像是bug的东西。我将提交错误报告。谢谢!我发现了一个不同的解决方法,那就是调用
[mapView setRegion:animated:
,并使“region”的跨度与当前的稍有不同。这也会触发重新绘制,尽管它确实会导致缩放级别略有更改。我将尝试只设置中心坐标,这将避免缩放反弹。谢谢!我发现了一个不同的解决方法,那就是调用[mapView setRegion:animated:
,并使“region”的跨度与当前的稍有不同。这也会触发重新绘制,尽管它确实会导致缩放级别略有更改。我将尝试只设置中心坐标,这样可以避免缩放反弹。