Как удалить мою пользовательскую аннотацию из mapView? - PullRequest
0 голосов
/ 15 февраля 2019

Прежде всего, уверяю вас, это не повторяющийся вопрос.У меня есть карта, и я хочу изменить координату аннотации в направлении X, если пользователь изменит регион.Моя цель - создать булавки на левой стороне обзора.

Когда я создаю свой пин-код, я добавляю его к своим булавкам var: MyCustomPin также.Тем не менее, в моем regionDidChangeAnimated;

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

    calculateZoomFactor()

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

и моя функцияrangePins () делает;

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 голосов
/ 15 февраля 2019

Вы удаляете ваш пин-код из mapView, но вы не удаляете его из массива pins.Итак, когда вы создаете новый вывод, вы всегда основываете его координату x на исходных выводах, которые вы добавили в массив (и впоследствии удалили из mapView).

Аналогичным образом вы добавляете новый вывод в mapView, но не добавляете его в массив pins.Поэтому вы никогда не удаляете эти новые выводы из mapView, так как вы удаляете только выводы из mapView, когда просматриваете массив pins.

Например, ваш 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, а затем использовал его для замены массива pins после цикла for.)

Несколько вещей, которые вы можете рассмотреть:

  • Вместо того, чтобы поддерживать свой собственный массив 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            
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...