iOS MapKit:如何防止MKMapView setRegion更改区域?
我正在用MapView制作一个应用程序,我想用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
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
中获得更可靠的行为?我解决了这个问题,在区域更改时不保存最后一个区域,而不是在触发“视图应消失”操作时保存区域。如关闭按钮或完成按钮