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

时间:2016-04-07 00:10:54

标签: ios swift mkmapview mapkit

我正在使用MapView制作应用程序,并希望使用NSUserDefaults保留地图的位置。每当地图的位置发生变化时,我都会保存地图区域。加载视图时,如果存在已保存的地图区域,则在MapView上使用保存的区域调用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.4232294187297,   2.8355733828259,3.85688659929976])

     

加载已保存的区域

     

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

     

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

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

  

设置新区域时,地图可能会调整区域中的值   参数,以便它精确地适合地图的可见区域。这个   调整是正常的,并确保在该值   region属性始终反映地图的可见部分。   但是,它确实意味着如果您获得该财产的价值   调用此方法后,返回的值可能与值不匹配   你设定。 (您可以使用regionThatFits:方法来确定   实际上由地图设置的区域。)

region的{​​{1}}参数是否已经适合地图的可见区域,因为此区域来自之前保存的地图位置?如何从setRegion获得更可靠的行为?

1 个答案:

答案 0 :(得分:0)

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