How to make custom MKPolyline in SWIFT with additional argument - color
Asked Answered
R

3

8

Can any help me with making custom MKPolyline with additional argument Color?

CustomPolyline.swift

import Foundation
import MapKit
class CustomPolyline : MKPolyline {
    let coordinates: UnsafeMutablePointer<CLLocationCoordinate2D>
    let count : Int = 0
    let color : String = "ff0000"
    init(coordinates: UnsafeMutablePointer<CLLocationCoordinate2D>, count: Int, color: String) {

        self.coordinates = coordinates
        self.count = count
        self.color = color
    }
}

Init

Polyline = CustomPolyline(coordinates: &Path, count: Path.count, color: "ff0000")
self.mapView.addOverlay(Polyline)

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {      
        if (overlay is CustomPolyline) {
            var pr = MKPolylineRenderer(overlay: overlay);
            pr.strokeColor = UIColor.colorWithRGBHex(0xff0000).colorWithAlphaComponent(0.5);
            pr.lineWidth = 10;
            return pr;
        }

        return nil
    }

My solution doesn't work and I can't figure it out why. Polylines isn't visible at all. I'm a beginner in SWIFT so I think that problem is with my CustomPolyline class. Thanks for help.

Rights answered 24/9, 2014 at 7:26 Comment(0)
R
14

It can be done much more simpler than I throught:

Class

import Foundation
import MapKit

class CustomPolyline : MKPolyline {

    var color: String?
}

Init

cPolyline = CustomPolyline(coordinates: &Path, count: Path.count)
cPolyline.color = "#ff0000"
self.mapView.addOverlay(cPolyline)

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

            var pr = MKPolylineRenderer(overlay: overlay);
            pr.strokeColor = UIColor(rgba: overlay.color);
            pr.lineWidth = 10;
            return pr;

    }
Rights answered 24/9, 2014 at 9:56 Comment(4)
I am having trouble with MKPolyline, specifically in passing in the UnsafeMutablePointer. How is that constructed? What is the type of the Path variable you are passing in?Chimaera
Path is simple CLLocationCoordinate2D array var Path:[CLLocationCoordinate2D] = [locationOne,locationTwo]Rights
changing the renderForOverlay type from the default MKOverlay to CustomPolyLine makes it so nothing is drawn, any suggestions?Zeus
Not working for me. I get nothing drawn. Xcode asks to make the delegate function private if I replace MKOverlay to CustomPolyLine. Obv Xcode doesn't see that as delegate function anymore. Casting did not work either...Joan
G
5

As user3470987 pointed out, there might be an issue in modifying the default 'rendererForOverlay' delegate function. It could also prove difficult if you'd like to add overlays of other types than MKPolyline.

Class

import Foundation
import MapKit

class Polyline: MKPolyline {
    var color: UIColor?
}

Render function

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

    if let polyline = overlay as? Polyline {

        let polylineRenderer = MKPolylineRenderer(overlay: polyline)
        polylineRenderer.strokeColor = polyline.color
        polylineRenderer.lineWidth = 3
        return polylineRenderer
    }

    return MKOverlayRenderer(overlay: overlay)

}
Gauss answered 31/5, 2017 at 20:49 Comment(1)
This should be the accepted answer? It is crucial to get the signature of the delegate function correct otherwise it will not draw anything!Joan
F
1

Another solution most easy:

extension UIColor {
    static var rendererColor: UIColor {
        return UIColor(red: 65/255, green: 65/255, blue: 65/255, alpha: 1)
    }
}

And the use:

renderer.strokeColor = UIColor.renderer
Ferrous answered 10/7, 2018 at 21:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.