如何解决每次移动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 举报,一经查实,本站将立刻删除。