如何从 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            
  }
}