删除特定的mapView.overlay

时间:2017-05-04 07:46:10

标签: ios swift mkmapviewdelegate

我目前正在做一个涉及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)
}

但是这行代码删除了所有叠加层,我只想删除,例如,前一个圆叠加层。例如,无法找到一种方法来命名叠加层,以便在删除时可以对其进行引用。希望我能够很好地解释我的情况。

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

3 个答案:

答案 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)

您应该通过属性保留叠加层的引用。因此,每次创建新的叠加层(圆形或折线)时,都必须删除旧的叠加层。您可以为每个叠加层创建多个属性,也可以为特定场景保留一系列叠加层。我的意思是,如果在某些特定情况下你必须使用几个覆盖实例,你应该保留数组。无论如何,一切都取决于具体情况!