MKMapView显示错误保存的区域

Kam*_*com 15 objective-c nsuserdefaults mkcoordinateregion mkmapview ios

当我的iPhone应用程序关闭时,我将地图区域保存为用户默认值:

MKCoordinateRegion region = mapView.region;
[[NSUserDefaults standardUserDefaults] setDouble:region.center.latitude forKey:@"map.location.center.latitude"];
[[NSUserDefaults standardUserDefaults] setDouble:region.center.longitude forKey:@"map.location.center.longitude"];
[[NSUserDefaults standardUserDefaults] setDouble:region.span.latitudeDelta forKey:@"map.location.span.latitude"];
[[NSUserDefaults standardUserDefaults] setDouble:region.span.longitudeDelta forKey:@"map.location.span.longitude"];
Run Code Online (Sandbox Code Playgroud)

当应用程序再次启动时,Ш以相同的方式读取这些值,以便用户可以看到与上次完全相同的地图视图:

MKCoordinateRegion region;

region.center.latitude  = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.latitude"];
region.center.longitude = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.longitude"];
region.span.latitudeDelta  = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"];
region.span.longitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"];

NSLog([NSString stringWithFormat:@"Region read  : %f %f %f %f", region.center.latitude, region.center.longitude, region.span.latitudeDelta, region.span.longitudeDelta]);

[mapView setRegion:region];

NSLog([NSString stringWithFormat:@"Region on map: %f %f %f %f", mapView.region.center.latitude, mapView.region.center.longitude, mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta]);
Run Code Online (Sandbox Code Playgroud)

我从用户默认值中读取的区域(毫不奇怪)与保存时完全相同.请注意,保存的内容直接来自地图,因此不会以任何方式进行转换.我用setRegion:方法将它设置在地图上,但后来却与众不同!

示例结果:

Region read  : 50.241110 8.891555 0.035683 0.042915<br>
Region on map: 50.241057 8.891544 0.050499 0.054932
Run Code Online (Sandbox Code Playgroud)

有人知道为什么会这样吗?

小智 8

这里的问题是当您设置区域时,地图缩放级别"捕捉"到最近的缩放阈值.(我怀疑这些缩放阈值是双击或双指敲击时获得的缩放量)

因此,如果地图例如显示缩放级别1,并且您将区域设置为相同的跨度值:region = [mapView region]; [mapView setRegion:region];它将"捕捉"到级别1 之上的最近缩放级别,即级别2,您将缩小大约1因子2.

原始海报的解决方法是在设置区域之前稍微减小跨度值,这样当视图突然显示时,它会跳出到它所在的缩放级别,而不是上面的缩放级别.

例如

region.span.latitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"] * 0.999;

region.span.longitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"] * 0.999;

如果用户使用双击(并因此从阈值跳到阈值)进行缩放,则效果非常好,几乎完全将它们返回到相同的视图.

但是,如果它们捏缩放并且视图位于缩放阈值之间,它仍将捕捉到下一级别.在这种情况下不太好,但目前还没有解决.

苹果雷达上存在开放式漏洞,希望它将在未来版本中修复.


小智 2

我有同样的问题。这非常令人沮丧。MKMapView 的文档似乎在某些有关数据类型的领域不正确。

如果将区域参数设置为 (double),您将收到所遇到的错误。但是,如果区域参数被传递(浮动),您将得到正确的行为。

所以尝试一下

MKCoordinateRegion region = {{0.0f,0.0f},{0.0f,0.0f}};

region.center.latitude = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.latitude"];
region.center.longitude = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.longitude"];
region.span.latitudeDelta = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"];
region.span.longitudeDelta = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"];

mapView.region = region;
Run Code Online (Sandbox Code Playgroud)