的MKMapView显示不正确保存区的MKMapView显示不正确保存区(MKMapView sho

2019-05-12 05:10发布

我节省地图区域到时我的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

是否有人知道为什么会这样?

Answer 1:

这里的问题是,当你设置的区域,地图缩放级别“捕捉”走出去最近的变焦阈值。 (我怀疑这些变焦阈值变焦的金额你当你双击或两个手指敲击)

因此,如果在地图是显示例如缩放级别为1时,如果将区域设置为相同的跨度值正是如此: region = [mapView region]; [mapView setRegion:region]; region = [mapView region]; [mapView setRegion:region]; 它将“捕捉”走出去最近的缩放级别高于 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;

如果用户已经用双水龙头缩放(因此从门限阈值跳)这个工作得很好,把他们送回了同样的观点几乎完全。

但是,如果他们捏缩放和视图是中途之间的变焦阈值还是会振作起来到一个新的水平。 在这种情况下不那么好,但也没有修复尚未。

有苹果雷达开放的错误对于这一点,希望这将是固定在未来的版本。



Answer 2:

好了,所以我一直在努力,现在这个问题有一段时间了,我认为我已经想出了通过这些混沌理论启发的有效解决方案( 的MKMapView表现出不正确保存区 )。 基本上,如果你设置与您从取NSUserDefaults的地图视图已完成其初始加载后(完成与“振作起来”的行为)的值地图视图区域,地图区域将是你希望它是什么。 关键是要找到在应用程序代码中的钩下游某处从已初始化的地图视图。 不漂亮,但它工作完美的我。 由于这些混沌的见解。



Answer 3:

我有同样的问题。 这是非常令人沮丧。 看来,为的MKMapView的文档是关于数据类型某些区域不正确。

如果设置了区域参数(双)是你能得到你所遇到的错误。 但是,如果区域参数传递(浮动)■你会得到正确的行为。

因此,尝试

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;


Answer 4:

我无法验证这工作。 任何人都可以这样做? 我愿意打赌,你看到的是你的双打截断成花车的效果。 在某些情况下,当这发生在我身上,我发现我可以乘以0.9999的跨度和重置区域,然后它会是我想要的。 但是,并非所有地区 - 有时是很大的不同,会产生不同的20%,特别是对小跨度。



Answer 5:

我使用的0.9,而不是0.999倍增系数仍然有时推了,但似乎拥抱接近所需的缩放发现更大的成功。 还是愿意爱来解决这个问题,只是说我打败它! 哈哈



Answer 6:

也尝试存储般的姿态

self.lastCameraAtitude = self.mapView.camera.altitude;

而当u配置图

[self.mapView.camera setAltitude:self.lastCameraAtitude];

这将为同一区域相同的相机设置。 在你的情况ú只设置区域而不是相机。



Answer 7:

这里有一个斯威夫特扩展正确编码和解码MKCoordinateRegion:

extension MKCoordinateRegion {

    var encode:[String: AnyObject] {
        return ["center":
                   ["latitude": self.center.latitude,
                   "longitude": self.center.longitude],
                "span":
                   ["latitudeDelta": self.span.latitudeDelta,
                   "longitudeDelta": self.span.longitudeDelta]]
    }

    init?(decode: [String: AnyObject]) {

        guard let center = decode["center"] as? [String: AnyObject],
            let latitude = center["latitude"] as? Double,
            let longitude = center["longitude"] as? Double,
            let span = decode["span"] as? [String: AnyObject],
            let latitudeDelta = span["latitudeDelta"] as? Double,
            let longitudeDelta = span["longitudeDelta"] as? Double
        else { return nil }


        self.center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
        self.span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)
    }
}

这是如何使用它:

// Save
NSUserDefaults.standardUserDefaults().setObject(mapView.region.encode, forKey: "mapRegion01")

// Restore
if let dict = NSUserDefaults.standardUserDefaults().dictionaryForKey("mapRegion01"),
    let myRegion = MKCoordinateRegion(decode: dict) {

    // do something with myRegion
}


Answer 8:

最近我打同样的事情。 从早期的答案,下面的迅速落实4对我的作品使用的见解:

override func viewWillAppear(_ animated: Bool) {
    if isMovingToParentViewController {
        setInitialRegion()
        DispatchQueue.main.asyncAfter(deadline: .now(), execute: {
            self.setInitialRegion()
        })
    }
}

此设置当地图视图控制器被推入视图的初始变焦区域。 到setInitialRegion同步调用将设置一个区域捕捉到缩放级别。 到setInitialRegion异步调用将设置的确切区域。 同步调用仍然需要去除变焦文物。



Answer 9:

如果设置了InterfaceBuilder下的MapView,确保你不这样做:

_mapView = [[MKMapView alloc] init];

当我删除了此行的init,我的地图视图突然开始正确响应所有我把它更新。 我怀疑发生的事情是,如果你做的alloc初始化,它实际上创造不是被任何地方出另一种看法。 你在屏幕上看到的一个是一个通过你的笔尖初始化。 但是,如果你的alloc初始化一个新的,然后这东西别的地方,它不会做任何事情。



文章来源: MKMapView show incorrectly saved region