删除特定 mapView.overlay

removing specific mapView.overlay

我目前正在做一个涉及 mapView 的项目,该项目需要显示一条连接两点并围绕用户位置的圆。

我的代码是这样的:

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)
}

createCircle() 和 createPolyline() 每当位置发生变化时都会被调用,这样它也会移动到用户所在的位置,我的问题是保留了以前的叠加层,而新的叠加层与它们重叠。我找到了删除叠加层的方法,

let overlays = mapView.overlays
mapView.removeOverlays(overlays)

但是这行代码去掉了所有的overlay,我只想去掉,比如之前的Circle Overlay。例如,无法找到一种方法来命名覆盖层,以便在删除时可以参考它。希望我能够很好地解释我的情况。

解决此问题的最佳方法是什么?谢谢!

您需要将原始 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
        }
    }
}

您应该通过 属性 保留叠加层的参考。所以每次你创建一个新的叠加层(圆或折线)你必须删除旧的。您可以为每个叠加层创建多个属性,也可以为特定场景保留一组叠加层。我的意思是,如果在某些特定情况下你必须使用多个覆盖实例,你应该保留数组。总之,一切看具体情况!

我运行陷入同样的​​问题。如果你只想从 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)
        }
    }
}