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

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


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


Ответы (1)


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

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