Swift 改变现有的MKOverlays-如何确定要改变的内容?

Swift 改变现有的MKOverlays-如何确定要改变的内容?,swift,mapkit,Swift,Mapkit,我正在尝试更改地图上现有MKOverlay的颜色 我正在将几个多边形作为唯一的覆盖添加到mapView。渲染时,覆盖的颜色由mapView rendererFor函数应用。 我想定期更改现有覆盖的颜色;理想情况下,无需全部移除并重新添加。我有处理颜色变化的代码,但除了按类型(MKPolygon,MKCircle)外,我不知道如何识别不同的覆盖-但在我的情况下,所有覆盖都是MKPolygon,因此执行代码只会更改所有覆盖 在使用addOverlay和操纵标题之前,我曾尝试将MKPolygon转换

我正在尝试更改地图上现有MKOverlay的颜色

我正在将几个多边形作为唯一的覆盖添加到mapView。渲染时,覆盖的颜色由mapView rendererFor函数应用。
我想定期更改现有覆盖的颜色;理想情况下,无需全部移除并重新添加。我有处理颜色变化的代码,但除了按类型(MKPolygon,MKCircle)外,我不知道如何识别不同的覆盖-但在我的情况下,所有覆盖都是MKPolygon,因此执行代码只会更改所有覆盖

  • 在使用addOverlay和操纵标题之前,我曾尝试将MKPolygon转换为MKOverlay,但标题是“仅获取”
  • 我已经尝试过对MKPolygon进行子类化,但我的阅读表明这在Swift中是不好的
我像这样添加覆盖层

  var shapeNW:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.313319, longitude: -124.109715))
        var shapeNE:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.313312, longitude: -124.108695))
        var shapeSW:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.312661, longitude: -124.109767))
        var shapeSE:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.312626, longitude: -124.108679))


        var myShapePoints:[MKMapPoint] = [shapeNW,shapeNE,shapeSE,shapeSW]
      //  addAnItemToMap(title: "Circle", locationName: "CircleName", type: "SS", coordinate: feiLocation, horizontalAccuracy: 20)
        var myShape:MKPolygon = MKPolygon(points: myShapePoints, count: 4)
        mapView.addOverlay(myShape)
这是我的函数,我使用它在创建颜色后更改颜色。但显然,此函数会更改所有项目的颜色,因为它无法识别要更改的覆盖。这是我的问题,我想确定具体的覆盖和改变只是它

func changeColor(identifier: String) {
        let overlays = self.mapView.overlays
        let duration:TimeInterval = 5.0

        for overlay in overlays {
            if identifier == "on"{
                let renderer = mapView.renderer(for: overlay) as! MKPolygonRenderer
                    DispatchQueue.main.async{
                        renderer.alpha = 1.0
                            renderer.fillColor = UIColor.blue
                        }
                    }

                else {
                let renderer = mapView.renderer(for: overlay) as! MKPolygonRenderer
                    DispatchQueue.main.async{
                        renderer.alpha = 0.0
                    }
                }
            }
        }

您只需子类化
MKPolygon

class CustomPolygon: MKPolygon {
    var identifier: String? = nil
}
然后,您可以相应地配置渲染器:

func configureColor(of renderer: MKPolygonRenderer, for overlay: MKOverlay) {
    let baseColor: UIColor
    if let polygon = overlay as? CustomPolygon, polygon.identifier == "on" {
        baseColor = .cyan
    } else {
        baseColor = .red
    }
    renderer.strokeColor = baseColor.withAlphaComponent(0.75)
    renderer.fillColor = baseColor.withAlphaComponent(0.25)
}
然后您的主
渲染器(for:)
可以使用:

extension ViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = MKPolygonRenderer(overlay: overlay)
        renderer.lineWidth = 5
        configureColor(of: renderer, for: overlay)
        return renderer
    }
}
您的更新例程可以:

func updateColors() {
    for overlay in mapView.overlays {
        if let renderer = mapView.renderer(for: overlay) as? MKPolygonRenderer {
            configureColor(of: renderer, for: overlay)
        }
    }
}


就个人而言,与其让标识符不在“上的覆盖图的
alpha
值为0,我只想从地图中删除这些覆盖图,然后您就不必处理这些问题了。

您可以将
MKPolygon
子类化:

class CustomPolygon: MKPolygon {
    var identifier: String? = nil
}
然后,您可以相应地配置渲染器:

func configureColor(of renderer: MKPolygonRenderer, for overlay: MKOverlay) {
    let baseColor: UIColor
    if let polygon = overlay as? CustomPolygon, polygon.identifier == "on" {
        baseColor = .cyan
    } else {
        baseColor = .red
    }
    renderer.strokeColor = baseColor.withAlphaComponent(0.75)
    renderer.fillColor = baseColor.withAlphaComponent(0.25)
}
然后您的主
渲染器(for:)
可以使用:

extension ViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = MKPolygonRenderer(overlay: overlay)
        renderer.lineWidth = 5
        configureColor(of: renderer, for: overlay)
        return renderer
    }
}
您的更新例程可以:

func updateColors() {
    for overlay in mapView.overlays {
        if let renderer = mapView.renderer(for: overlay) as? MKPolygonRenderer {
            configureColor(of: renderer, for: overlay)
        }
    }
}


就个人而言,与其让标识符不在“上的覆盖图的
alpha
值为0,我只想从地图上删除这些覆盖图,这样你就不必处理这些问题了。

Rob,为了简化我的问题,我想我可能让我的代码意图看起来很愚蠢。但你的代码正是我需要的。对我来说,缺少的链接是子类化——现在我在实践中看到了它,这非常有意义。再次感谢您抽出时间,不用担心。我希望你没有对我的评论生气。很高兴我能帮上忙。Rob,在我努力简化我的问题时,我想我可能使我的代码意图看起来很愚蠢。但你的代码正是我需要的。对我来说,缺少的链接是子类化——现在我在实践中看到了它,这非常有意义。再次感谢您抽出时间,不用担心。我希望你没有对我的评论生气。很高兴我能帮忙。