微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每次移动UISlider时都删除注释-mapView,Swift

如何解决每次移动UISlider时都删除注释-mapView,Swift

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

解决方法

更多信息对于生成更具体的答案将非常有帮助。但是解决方案之一可能是这样的:

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中。在这种情况下,将滑块移动到递增值时,应该显示越来越多的注释。减少滑块值时的注释更少。可以在其中应用任何其他逻辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。