Удалять аннотации каждый раз при перемещении UISlider — mapView, Swift

Как я могу удалить аннотации динамически. То есть, например, если у меня есть UISlider, то при каждом перемещении ползунка я хочу удалить какие-то аннотации на карте. Как это сделать? (обратите внимание, аннотации на карте добавляются к каждому перемещению ползунка, но аннотации предыдущего шага ползунка ДОЛЖНЫ быть удалены).


person sandrodothinks    schedule 22.10.2020    source источник


Ответы (1)


arrow_upward
0
arrow_downward

некоторая дополнительная информация была бы очень полезна для получения более конкретного ответа. Но одно из решений может быть таким:

import UIKit
import MapKit

class MapViewController: UIViewController {

    @IBOutlet private var mapView: MKMapView?

    private var myItems: [Item]? {
        didSet {
            clearItems()
            refreshItems()
        }
    }

    private var sliderValue: CGFloat = 0.0 {
        didSet {
            refreshItems()
        }
    }

    private func clearItems() {
        guard let mapView = mapView else { return }
        mapView.removeAnnotations(mapView.annotations)
    }

    private func refreshItems() {
        guard let myItems = myItems else { return }

        let itemsToRemove = myItems.filter { $0.minimumDisplayValue > sliderValue && $0.isShown }
        mapView?.removeAnnotations(itemsToRemove.map { $0.annotation })
        itemsToRemove.forEach { $0.isShown = false }

        let itemsToAdd = myItems.filter { $0.minimumDisplayValue <= sliderValue && !$0.isShown }
        mapView?.addAnnotations(itemsToAdd.map { $0.annotation })
        itemsToAdd.forEach { $0.isShown = true }
    }

    @IBAction private func sliderMoved(_ sender: UISlider) {
        self.sliderValue = CGFloat(sender.value)
    }


}

// MARK: - Item

private extension MapViewController {

    class Item {
        let annotation: MKAnnotation
        let minimumDisplayValue: CGFloat
        var isShown: Bool = false

        init(annotation: MKAnnotation, minimumDisplayValue: CGFloat) {
            self.annotation = annotation
            self.minimumDisplayValue = minimumDisplayValue
        }
    }

}

В этом случае вы можете хранить все аннотации под myItems. Затем, когда вы перемещаете ползунок, вы в основном меняете фильтр того, какие из этих элементов фактически отображаются на карте.

Самое интересное происходит в refreshItems. В этом случае при перемещении ползунка в сторону увеличения значений должно отображаться все больше и больше аннотаций. И меньше аннотаций при уменьшении значения ползунка. Хотя здесь можно применить любую другую логику.

person Matic Oblak    schedule 22.10.2020
comment
Я задавал аналогичный вопрос раньше, но с некоторым кодом по этой ссылке, просто никто не ответил... дайте мне знать stackoverflow.com/questions/64471948/ - person sandrodothinks; 22.10.2020