我正在制作一个带有 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 的可见区域:region
的 setRegion
参数不应该已经适合 map 的可见区域,因为该区域来自之前保存的 map 位置吗?如何从 setRegion
获得更可靠的行为? 最佳答案
我解决了这个问题,即我不保存区域更改时的最后一个区域,而是在 View 消失时保存该区域。 Action 被触发。像关闭按钮或完成按钮
关于iOS MapKit : how to prevent MKMapView setRegion from changing region?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36464459/