当我的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"];
当应用再次启动时,Ш以相同的方式读取这些值,以便用户可以看到与上次完全相同的地图视图:
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]);
从用户默认值读取的区域(不奇怪)与保存时完全相同.请注意,保存的内容直接来自地图,因此不会以任何方式进行转换.我用setRegion:方法将其设置回地图,但是它是不同的!
示例结果:
Region read : 50.241110 8.891555 0.035683 0.042915<br> Region on map: 50.241057 8.891544 0.050499 0.054932
有人知道为什么会这样吗?
解决方法
这里的问题是当您设置区域时,地图缩放级别“捕捉”到最接近的缩放阈值. (我怀疑这些缩放阈值是您双击或双指敲击时获得的缩放量)
因此,如果地图显示缩放级别1,并且您将区域设置为相同的跨度值:region = [mapView region]; [mapView setRegion:region];它将“捕捉”到最高1级以上的缩放级别,即2级,您将缩小约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;
如果用户使用双抽头进行了缩放(因此从阈值跳到阈值),这很好,几乎完全将它们返回到相同的视图.
但是,如果缩放比例缩小,并且视图位于缩放阈值之间,则它仍然会弹出到下一级.在这种情况下不太好,但还没有修复.
苹果雷达上出现了一些bug,希望在未来的版本中修复.