【发布时间】:2020-10-22 08:39:59
【问题描述】:
如何“动态”删除注释。也就是说,例如,如果我有一个 UISlider,每次我移动滑块时,我都想删除地图上的一些注释。如何做呢? (请注意,滑块的每一次移动都会添加地图上的注释,但必须删除滑块上一步的注释)。
【问题讨论】:
标签: ios swift mkmapview uislider mkannotation
如何“动态”删除注释。也就是说,例如,如果我有一个 UISlider,每次我移动滑块时,我都想删除地图上的一些注释。如何做呢? (请注意,滑块的每一次移动都会添加地图上的注释,但必须删除滑块上一步的注释)。
【问题讨论】:
标签: ios swift mkmapview uislider mkannotation
更多信息将非常有助于生成更具体的答案。但其中一种解决方案可能是这样的:
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。在这种情况下,当您将滑块移动到增加值时,应该会显示越来越多的注释。减少滑块值时注释更少。不过,任何其他逻辑都可以在其中应用。
【讨论】: