【问题标题】:How to remove my custom annotation from mapView?如何从 mapView 中删除我的自定义注释?
【发布时间】:2019-02-15 09:03:28
【问题描述】:

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

当我创建我的 pin 时,我将它添加到我的 var pin: 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 中删除旧注释。使用removeAnnotations 方法。
  • 我正在使用删除注释方法,如您所见.. 但是我无法删除所有注释.. self.mapView.removeAnnotation(pin) 您可以在我的arrangePins() 函数中看到此代码
  • 我不想删除所有注释。你没看我的评论吗?
  • 可能是 MapKit 中已有百万年历史的错误,请参阅 stackoverflow.com/questions/6876662/…

标签: ios swift mapkit mkannotation mkannotationview


【解决方案1】:

您正在从 mapView 中删除您的 pin,但您没有从您的 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            
  }
}

【讨论】:

  • 我无法移动我的图钉,因为我的地图中有不同类型的图钉。我刚刚在我的列表中添加了一种副本。我首先尝试用标题移动我的图钉,但是我得到了错误。然后我尝试删除并添加新的。如果我尝试你在 sn-p 中写的内容,我只会改变我的引脚坐标。但是 mapView 注释坐标不会改变。
  • 我之前没有意识到关于我的数组初始化的菜鸟错误。所以非常感谢你:)
  • “如果我尝试你在 sn-p 中写的内容,我只会更改我的引脚坐标。但是 mapView 注释坐标不会改变”-> 我不确定你是什么说实话。我假设您的MyPin 类子类MKPointAnnotation,即您的引脚 MKPointAnnotations,因此更改引脚的坐标会将其移动到地图视图上。
  • let pin = myPin(pinPoint.coordinate, title) mapView.addAnnotation(pin) pins.append(pin) 我将它们添加到地图和我的数组中......但是当我改变我的引脚坐标时我的阵列,他们没有移动
  • 啊,好吧,如果你的 MyPin 类需要一个只能获取的坐标,那是有道理的。也许你的MyPin 类子类MKAnnotation。您也可以将其设置为MKPointAnnotation 的子类,该子类具有coordinate 属性,既可获取又可设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多