我正在使用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
获得更可靠的行为?
答案 0 :(得分:0)
我解决了这个问题,我不保存区域更改时的最后一个区域,而是在视图消失时保存区域,而不是触发了动作。像关闭按钮或完成按钮