如何在Mapkit中画出两条不同颜色的折线?

7
这是我用来画第一条线的代码, 如何用另一种颜色画另一条线?
 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。 - qwerty_so
1
尝试这个:https://dev59.com/OIPba4cB1Zd3GeqPva2L。但是,与其将自定义的“color”属性声明为“String?”,我认为将其声明为“UIColor?”会更简单。 - user467105
在你展示给我的那篇帖子中,Objective-C 中有一个名为 Color 的属性,但我在 Swift 中找不到它。 - user4473926
没错。这篇文章建议你继承MKPolyline类并添加一个名为color的自定义属性。你的方法也可以实现同样的效果。不过有一个缺点,就是你必须保留对每个折线的引用,并且委托方法必须引用它们,这使得它不够自包含。 - user467105
3个回答

8
最终我找到了方法:
在类的顶部,我放置了以下代码:
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"不再可行,请参阅此问答以获取更多详细信息:https://dev59.com/8pDea4cB1Zd3GeqPWQoI - prince

2
我可以帮您翻译成中文。以下是翻译的结果:

我已经找到了另一种方法。

首先,我们需要扩展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函数:
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()
    }
}

太棒了。我使用了它,非常简单,完美地满足了我的需求。 - corleyq

2

我曾经也遇到过同样的问题,但我找到了另一种解决方法。

在地图视图中,代码将会是:

    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
    }

我只有一个名为variables的结构体,它包含变量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
    }

使用这些方法,我只需要将变量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)

First post here :D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接