MKPolyline strange rendering related with zooming in MapKit

ios, mapkit, mkoverlay, mkpolyline, swift

Solution

Swift 3 solution :

Create a subclass of MKPolylineRenderer

class CustomPolyline: MKPolylineRenderer {

    override func applyStrokeProperties(to context: CGContext, atZoomScale zoomScale: MKZoomScale) {
        super.applyStrokeProperties(to: context, atZoomScale: zoomScale)
        UIGraphicsPushContext(context)
        if let ctx = UIGraphicsGetCurrentContext() {
            ctx.setLineWidth(self.lineWidth)
        }
    }
}

Then use it in your rendererFor MapKit delegate :

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = CustomPolyline(overlay: overlay)
        renderer.strokeColor = UIColor.red
        renderer.lineWidth = 100
        return renderer
}

Your polylines won't re-render after zooming thus avoiding the artifacts

Problem

I have very simple View Controller to demonstrate this strange rendering behavior of MKPolyline. Nothing special just normal api calls. ``` import UIKit import MapKit class ViewController: UIViewController, MKMapViewDelegate { @IBOutlet weak var map: MKMapView! override func viewDidLoad() { super.viewDidLoad() map.delegate = self } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let p1 = CLLocationCoordinate2D(latitude: 51, longitude: 13) var coords = [ p1, CLLocationCoordinate2D(latitude: 51.1, longitude: 13), CLLocationCoordinate2D(latitude: 51.2, longitude: 13), CLLocationCoordinate2D(latitude: 51.3, longitude: 13) ] let polyline = MKPolyline(coordinates: &coords, count: coords.count) map.addOverlays([polyline], level: .aboveRoads) let cam = MKMapCamera(lookingAtCenter: p1, fromDistance: 1000, pitch: 45, heading: 0) map.setCamera(cam, animated: true) } func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { let r = MKPolylineRenderer(overlay: overlay) r.strokeColor = UIColor.blue return r } } ``` The rendering of the polyline is very strange. During zooming and panning You can see some artifacts. Take a look at pictures below: Initial Screen After some panning After zooming out and zooming in again How to fix this? I was trying to implement my own renderer but its the same situation. Like overaly is cached and it's not redrawing on time. I'm working on iOS 10, iPhone 6, Simulator from iOS SDK 10 xCode 8.

Original source

Related problems