我正在制作一个带有 MapView 的应用程序,我想用 NSUserDefaults 保留 map 的位置。每本地图的位置发生变化时,我都会保存 map 区域。当 View 加载时,如果有一个已保存的 map 区域,那么我会使用保存的区域在 MapView 上调用 setRegion。问题是加载后的 map 位置与上次保存的位置不同。这是代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Read saved coordinate region from NSUserDefaults
    if let array = self.readSavedMapPosition() {
        print("Loading saved region")
        let mkcr = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: array[0], longitude: array[1]), span: MKCoordinateSpan(latitudeDelta: array[2], longitudeDelta: array[3]))
            self.mapView.setRegion(mkcr, animated: true)
    }
}

func saveMapPosition(mkcr: MKCoordinateRegion) {
    let defaults = NSUserDefaults.standardUserDefaults()
    let array = [mkcr.center.latitude, mkcr.center.longitude, mkcr.span.latitudeDelta, mkcr.span.longitudeDelta]
    print("map position saved: \(array)")
    defaults.setObject(array, forKey: savedMKCRArray)
}

func readSavedMapPosition() -> [Double]? {
    let defaults = NSUserDefaults.standardUserDefaults()
    let array = defaults.objectForKey(savedMKCRArray) as? [Double]
    print("map position read: \(array)")
    return array
}

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    print("Map view region changed, saving new position")
    let currentRegion = mapView.region
    self.saveMapPosition(currentRegion)
}

在模拟器中运行应用程序时,我会在控制台中得到这样的输出:



调用 setRegion 后,区域的坐标和跨度发生变化。 Apple 的 setRegion 文档解释说, map 可能会更改区域以适应 map 的可见区域:


regionsetRegion 参数不应该已经适合 map 的可见区域,因为该区域来自之前保存的 map 位置吗?如何从 setRegion 获得更可靠的行为?

最佳答案

我解决了这个问题,即我不保存区域更改时的最后一个区域,而是在 View 消失时保存该区域。 Action 被触发。像关闭按钮或完成按钮

关于iOS MapKit : how to prevent MKMapView setRegion from changing region?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36464459/

10-09 19:43