首先,我向你保证这不是一个重复的问题。我有一张地图,如果用户更改区域,我想从X方向更改我的注释坐标。我的目标是在视图的左侧创建我的引脚。
当我创建我的引脚时,我将它添加到我的var引脚:MyCustomPin也。但是,在我的regionDidChangeAnimated;
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
calculateZoomFactor()
if isInLegalRegion() {
//.....
} else {
mapView.setCenter(mapCenter, animated: true)
}
arrangePins()
}
和我的arrangePins()函数确实;
func arrangePins() {
for pin in pins {
let coord = pin.coordinate
let title = pin.title!
self.mapView.removeAnnotation(pin)
let xCoord = self.mapView.visibleMapRect.minX + 250
var newCoord = MKMapPoint(coord)
newCoord.x = xCoord
let newPin = MyPin(newCoord.coordinate, title)
mapView.addAnnotation(newPin)
}
}
到现在为止还挺好。虽然看似非常合乎逻辑且简单,但我的旧注释并未从地图中删除。有什么我想念的吗?
您正在从mapView中删除您的引脚,但您没有从pins
数组中删除它。所以 - 当你创建一个新的引脚时,你总是将它的x坐标基于你添加到数组中的原始引脚(随后从mapView
中移除)。
同样,您要向mapView添加一个新引脚,但不会将其附加到pins
数组。因此,您永远不会从mapView
中删除这些新引脚,因为您只是在循环通过pins
数组时从mapView中删除引脚。
例如,您的arrangePins
方法可能如下所示:
func arrangePins() {
var newPins:[MyPin] = []
for pin in pins {
let coord = pin.coordinate
let title = pin.title!
self.mapView.removeAnnotation(pin)
var newCoord = MKMapPoint(coord)
newCoord.x = self.mapView.visibleMapRect.minX + 250
let newPin = MyPin(newCoord.coordinate, title)
mapView.addAnnotation(newPin)
newPins.append(newPin)
}
pins = newPins
}
(为简化起见,我在newPins
数组中添加了新的引脚,然后用它来替换for循环后的pins
数组。)
您可能想要考虑的几件事:
pins
而不是维护你自己的mapView.annotations
数组(当然这假设你正在调整地图上的所有引脚,也许你只想调整一些特定的引脚)arrangePins
方法可能如下所示:func arrangePins() {
for pin in pins {
var newCoord = MKMapPoint(pin.coordinate)
newCoord.x = self.mapView.visibleMapRect.minX + 250
pin.coordinate = newCoord.coordinate
}
}