【问题标题】:How to draw two polylines in different colors in Mapkit?如何在 Mapkit 中绘制两条不同颜色的折线?
【发布时间】:2015-03-18 16:14:24
【问题描述】:

这是我绘制第一行的代码, 对于另一种颜色的另一条线,我该怎么办?????

 func mapView(mapView : MKMapView! , rendererForOverlay overlay: MKOverlay!) ->MKOverlayRenderer! {

    if overlay is MKPolyline {

        var polyLineRenderer = MKPolylineRenderer(overlay: overlay)
        polyLineRenderer.strokeColor = UIColor.blackColor()
        polyLineRenderer.lineWidth = 10

        return polyLineRenderer
    }
    return nil
  }

【问题讨论】:

  • 试试 NSColor.redColor().set
  • 试试这个:stackoverflow.com/questions/26010977/…。但与其将自定义 color 属性声明为 String?,我认为将其声明为 UIColor? 会更简单。
  • 在那篇文章中你告诉我 Anna,Objective-c 中有一个名为 Color 的属性,但我在 swift 中找不到它
  • 没错。该帖子说要继承 MKPolyline 并添加一个名为 color 的自定义属性。你的方法也会奏效。一个缺点是您必须保留对每条折线的引用,并且委托方法必须引用它们,这使得它的独立性比它可能的要少。

标签: swift mapkit polyline mkpolyline


【解决方案1】:

我终于找到了方法:

我放在班级的顶部

var toGo    : MKPolyline?
var toCome  : MKPolyline?

然后在视图中加载:

                    var polyLineGoes = MKPolyline(coordinates: &coordinateGoes, count: coordinateGoes.count)
                    toGo = polyLineGoes
                    mapView.addOverlay(polyLineGoes)


                    var polyLineComes = MKPolyline(coordinates: &coordinateComes, count: coordinateComes.count)
                    toCome = polyLineComes
                    mapView.addOverlay(polyLineComes)

在课程结束时:

func mapView(mapView : MKMapView! , rendererForOverlay overlay: MKOverlay!) ->MKOverlayRenderer! {

    if overlay is MKPolyline {
        if ( toGo  != nil) && (toCome != nil ) {
            if overlay as? MKPolyline  == toGo {
                var polyLineRenderer = MKPolylineRenderer(overlay: overlay)
                polyLineRenderer.strokeColor = UIColor.redColor()
                polyLineRenderer.lineWidth = 3

                return polyLineRenderer
            } else if overlay as? MKPolyline  == toCome {
                print(overlay.description)
                var polyLineRenderer = MKPolylineRenderer(overlay: overlay)
                polyLineRenderer.strokeColor = UIColor.blueColor()
                polyLineRenderer.lineWidth = 3

                return polyLineRenderer
            }
        }
    }
    return nil

}

【讨论】:

  • 我发现这很有用,尽管由于 Swift 发生了一些变化,这篇文章现在已经过时了。 “return nil”不能再做,更多细节请看这个问答:stackoverflow.com/questions/33102748/…
【解决方案2】:

我遇到了同样的问题,但我只是找到了另一种解决方法。

在mapView中的代码是:

    func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer!{
        if overlay is MKPolyline {
            var polylineRenderer = MKPolylineRenderer(overlay: overlay)
            polylineRenderer.strokeColor = variables.lineColor
            polylineRenderer.lineWidth = 4
            return polylineRenderer
        }
        return nil
    }

我只有一个名为变量的结构,它包含变量 lineColor。另外,我还有另一个 CONSTANT 结构,它有一些 CONSTANT 可以使 mapView 类中的代码更具可读性。这两个结构中的代码将是:

    struct CONSTANT {
        static let greenColor = UIColor.greenColor().colorWithAlphaComponent(0.5)
        static let blueColor = UIColor.blueColor().colorWithAlphaComponent(0.5)
        static let redColor = UIColor.redColor().colorWithAlphaComponent(0.5)
    }
    
    struct variables {
        // let the default lineColor be green
        static var lineColor = CONSTANT.greenColor
    }

有了这些,我只需将 variables.lineColor 更改为 CONSTANT 结构中的颜色。例如,

lineColor = CONSTANT.greenColor
mapView.addOverlay(myPolyLine, level: MKOverlayLevel.AboveRoads)

lineColor = CONSTANT.blueColor
mapView.addOverlay(myPolyLine, level: MKOverlayLevel.AboveRoads)

lineColor = CONSTANT.redColor
mapView.addOverlay(myPolyLine, level: MKOverlayLevel.AboveRoads)

第一次发帖:D

【讨论】:

    【解决方案3】:

    我找到了另一种方法。

    首先,我们需要扩展MKPolyline

    extension MKPolyline {
        struct ColorHolder {
            static var _color: UIColor?
        }
        var color: UIColor? {
            get {
                return ColorHolder._color
            }
            set(newValue) {
                ColorHolder._color = newValue
            }
        }
    }
    

    viewDidLoad 中,我们现在可以为每条折线指定颜色:

    var polyline1 = MKPolyline(coordinates: coordinates1, count: coordinates1.count)
    polyline1.color = UIColor(.red)
    mapView.addOverlay(polyline1)
    
    var polyline2 = MKPolyline(coordinates: coordinates2, count: coordinates2.count)
    polyline2.color = UIColor(.green)
    mapView.addOverlay(polyline2)
    

    最后,我们有了mapView-function:

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if let overlay_ = overlay as? MKPolyline {
            let renderer = MKPolylineRenderer(overlay: overlay)
            renderer.strokeColor = overlay_.color
            return renderer
        } else {
            return MKOverlayRenderer()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多