如何从mapView中删除我的自定义注释?

时间:2019-02-15 09:03:28

标签: ios swift mapkit mkannotation mkannotationview

首先,我向您保证这不是重复的问题。我有一张地图,如果用户更改区域,我想从X方向更改注释坐标。我的目标是在视图的左侧创建图钉。

当创建我的密码时,我将其添加到var密码中:MyCustomPin也是如此。但是,在我的区域中,DidChangeAnimated;

    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {

    calculateZoomFactor()

    if isInLegalRegion() {
        //.....
    } else {
        mapView.setCenter(mapCenter, animated: true)
    }
    arrangePins()
}

和我的rangingPins()函数都起作用;

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)
    }
}

到目前为止,一切都很好。尽管它看起来很合逻辑且很简单,但是我的旧注释并没有从地图中删除。有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

您要从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            
  }
}