【问题标题】:Altering Existing MKOverlays - How to identify which to alter?更改现有的 MKOverlays - 如何确定要更改的内容?
【发布时间】:2019-07-25 23:41:35
【问题描述】:

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

我添加了几个 MKPolygons 作为 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
                    }
                }
            }
        }

【问题讨论】:

    标签: swift mapkit


    【解决方案1】:

    你可以只继承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)
    }
    

    然后你的主要renderer(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)
            }
        }
    }
    

    就我个人而言,与其让标识符不是 "on" 的覆盖层的 alpha 为 0,不如从地图中删除这些覆盖层,然后您就不必处理任何这些了。

    【讨论】:

    • Rob,为了简化我的问题,我想我可能让我的代码意图看起来很愚蠢。但是您的代码正是我所需要的。对我来说缺少的环节是 subClassing - 现在我在实践中看到它非常有意义。再次感谢您抽出宝贵时间。
    • 不用担心。我希望你没有冒犯我的评论。很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多