如何从 mapView 中删除我的自定义注释?
How to remove my custom annotation from mapView?
首先我向你保证这不是一个重复的问题。我有一张地图,如果用户更改区域,我想从 X 方向更改我的注释坐标。我的目标是在视图的左侧创建我的图钉。
当我创建我的 pin 时,我将它添加到我的 var pin: MyCustomPin 中。但是,在我的地区 DidChangeAnimated;
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
数组。)
您可能需要考虑的几件事:
- 你可以简单地使用
mapView.annotations
而不是维护你自己的pins
数组(当然这是假设你正在调整地图上的所有图钉,也许你只想调整一些特定引脚)
- 与其删除和添加图钉,不如移动图钉?例如,
arrangePins
方法可能如下所示:
func arrangePins() {
for pin in pins {
var newCoord = MKMapPoint(pin.coordinate)
newCoord.x = self.mapView.visibleMapRect.minX + 250
pin.coordinate = newCoord.coordinate
}
}
首先我向你保证这不是一个重复的问题。我有一张地图,如果用户更改区域,我想从 X 方向更改我的注释坐标。我的目标是在视图的左侧创建我的图钉。
当我创建我的 pin 时,我将它添加到我的 var pin: MyCustomPin 中。但是,在我的地区 DidChangeAnimated;
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
数组。)
您可能需要考虑的几件事:
- 你可以简单地使用
mapView.annotations
而不是维护你自己的pins
数组(当然这是假设你正在调整地图上的所有图钉,也许你只想调整一些特定引脚) - 与其删除和添加图钉,不如移动图钉?例如,
arrangePins
方法可能如下所示:
func arrangePins() {
for pin in pins {
var newCoord = MKMapPoint(pin.coordinate)
newCoord.x = self.mapView.visibleMapRect.minX + 250
pin.coordinate = newCoord.coordinate
}
}