问题描述
如何“动态”删除注释。也就是说,例如,如果我有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
中。在这种情况下,将滑块移动到递增值时,应该显示越来越多的注释。减少滑块值时的注释更少。可以在其中应用任何其他逻辑。