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

问题描述 投票:0回答:1

首先,我向你保证这不是一个重复的问题。我有一张地图,如果用户更改区域,我想从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)
    }
}

到现在为止还挺好。虽然看似非常合乎逻辑且简单,但我的旧注释并未从地图中删除。有什么我想念的吗?

ios swift mapkit mkannotation mkannotationview
1个回答
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            
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.