Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:在MKMapView上,可以';t在MKMapTypeStandard和MKMapTypeMutedStandard类型之间切换_Ios_Mapkit_Mkmapview - Fatal编程技术网

iOS:在MKMapView上,可以';t在MKMapTypeStandard和MKMapTypeMutedStandard类型之间切换

iOS:在MKMapView上,可以';t在MKMapTypeStandard和MKMapTypeMutedStandard类型之间切换,ios,mapkit,mkmapview,Ios,Mapkit,Mkmapview,我的应用程序中有一个MKMapView,我希望用户能够切换地图类型,因此它可以是静音标准、标准、卫星或混合。我在地图视图控制器上连接了一个UISegmentedControl来更改地图类型。问题是,当我尝试在MutedStandard和Standard之间切换时(反之亦然),地图视图永远不会更新!它适用于所有其他类型的更改。。。如果我退出并重新加载应用程序,它就可以工作,但是如果只是在静音标准和标准之间,实时地图类型的更改就永远不会工作 另一件奇怪的事情是,它在iOS12上运行良好。。。只是不在

我的应用程序中有一个MKMapView,我希望用户能够切换地图类型,因此它可以是静音标准、标准、卫星或混合。我在地图视图控制器上连接了一个UISegmentedControl来更改地图类型。问题是,当我尝试在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]

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

你可以做很多事情来触发重画。例如,如果您在物理设备上并使用(在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”的跨度与当前的稍有不同。这也会触发重新绘制,尽管它确实会导致缩放级别略有更改。我将尝试只设置中心坐标,这样可以避免缩放反弹。