【问题标题】:Remove annotations each time the UISlider is moved - mapView, Swift每次移动 UISlider 时删除注释 - mapView, Swift
【发布时间】:2020-10-22 08:39:59
【问题描述】:

如何“动态”删除注释。也就是说,例如,如果我有一个 UISlider,每次我移动滑块时,我都想删除地图上的一些注释。如何做呢? (请注意,滑块的每一次移动都会添加地图上的注释,但必须删除滑块上一步的注释)。

【问题讨论】:

    标签: ios swift mkmapview uislider mkannotation


    【解决方案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。在这种情况下,当您将滑块移动到增加值时,应该会显示越来越多的注释。减少滑块值时注释更少。不过,任何其他逻辑都可以在其中应用。

    【讨论】:

    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多