我目前正在做一个涉及mapView的项目,该项目需要显示一条连接两个点并围绕用户位置的线圈。
我的代码是这样的:
default(size = (1000, 300))
只要位置发生变化,就会调用createCircle()和createPolyline(),以便它也会移动到用户所在的位置,我的问题是保留了以前的叠加层,并且新的叠加层重叠了它们。我找到了删除叠加层的方法,
self.mapView.delegate = self // on viewDidLoad
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
switch overlay {
case is MKCircle:
let circle = MKCircleRenderer(overlay: overlay)
circle.strokeColor = UIColor.blue
// circle.fillColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.1)
circle.fillColor = UIColor.blue
circle.lineWidth = 0.5
circle.alpha = 0.1
return circle
case is MKPolyline:
let polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = UIColor.black
polylineRenderer.lineWidth = 2
return polylineRenderer
default:
return MKPolygonRenderer()
}
}
func createCircle(location: CLLocation){
let circle = MKCircle(center: location.coordinate, radius: 500 as CLLocationDistance)
self.mapView.add(circle)
}
func createPolyline() {
var coords = [CLLocationCoordinate2D]()
coords.append(point1)
coords.append(point2)
let polyline = MKPolyline(coordinates: coords, count: coords.count)
self.mapView.add(polyline)
}
但是这行代码删除了所有叠加层,我只想删除,例如,前一个圆叠加层。例如,无法找到一种方法来命名叠加层,以便在删除时可以对其进行引用。希望我能够很好地解释我的情况。
解决此问题的最佳方法是什么?谢谢!
答案 0 :(得分:1)
您需要将原始MKOverlay
对象存储在媒体资源中,然后只需拨打remove
即可将其删除:
class MyViewController: UIViewController {
var circle: MKOverlay?
func createCircle(location: CLLocation){
self.removeCircle()
self.circle = MKCircle(center: location.coordinate, radius: 500 as CLLocationDistance)
self.mapView.add(circle!)
}
func removeCircle() {
if let circle = self.circle {
self.mapView.remove(circle)
self.circle = nil
}
}
}
答案 1 :(得分:1)
我遇到了同样的问题。如果您只想从MKMapView中删除特定的叠加层,则可以这样操作:
// Get the all overlays from map view
if let overlays = mapView?.overlays {
for overlay in overlays {
// remove all MKPolyline-Overlays
if overlay is MKPolyline {
mapView?.removeOverlay(overlay)
}
}
}
答案 2 :(得分:0)
您应该通过属性保留叠加层的引用。因此,每次创建新的叠加层(圆形或折线)时,都必须删除旧的叠加层。您可以为每个叠加层创建多个属性,也可以为特定场景保留一系列叠加层。我的意思是,如果在某些特定情况下你必须使用几个覆盖实例,你应该保留数组。无论如何,一切都取决于具体情况!