iOS MapKit:如何防止MKMapView setRegion更改区域?

iOS MapKit:如何防止MKMapView setRegion更改区域?,ios,swift,mkmapview,mapkit,Ios,Swift,Mkmapview,Mapkit,我正在用MapView制作一个应用程序,我想用NSUserDefaults保持地图的位置。每当地图的位置发生变化时,我都会保存地图区域。加载视图时,如果存在已保存的地图区域,则使用已保存的区域在地图视图上调用setRegion。问题在于加载后的地图位置与上次保存的位置不同。代码如下: override func viewDidLoad() { super.viewDidLoad() // Read saved coordinate region from NSUserDefau

我正在用MapView制作一个应用程序,我想用
NSUserDefaults
保持地图的位置。每当地图的位置发生变化时,我都会保存地图区域。加载视图时,如果存在已保存的地图区域,则使用已保存的区域在地图视图上调用setRegion。问题在于加载后的地图位置与上次保存的位置不同。代码如下:

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)
}
在模拟器中运行应用程序时,我将在控制台中获得如下输出:

地图位置读取:可选([42.6751429892564,-79.423229487297, 2.8355733828259,3.85688659929976])

加载保存区域

地图视图区域已更改,正在保存新位置

已保存地图位置:[39.9600790604276,-79.423229487296, 7.57379831196707,9.88327223217576]

调用
setRegion
后,将更改区域的坐标和范围。苹果的
setRegion
文档解释说,地图可能会改变区域以适应地图的可见区域:

设置新区域时,地图可能会调整区域中的值 参数,使其精确匹配贴图的可见区域。这 调整是正常的,是为了确保 “区域”属性始终反映地图的可见部分。 然而,这确实意味着如果你得到了产权的价值 调用此方法后,返回的值可能与值不匹配 你准备好了。(您可以使用RegionAtFits:方法来确定 实际将由地图设置的区域。)


setRegion
region
参数是否应该已经适合地图的可见区域,因为该区域来自地图先前保存的位置?如何从
setRegion
中获得更可靠的行为?

我解决了这个问题,在区域更改时不保存最后一个区域,而不是在触发“视图应消失”操作时保存区域。如关闭按钮或完成按钮