2016-10-25 29 views
9

Mam bardzo prosty kontroler widoku, który demonstruje to dziwne zachowanie renderowania MKPolyline. Nic specjalnego tylko zwykłe połączenia api.Dziwne renderowanie MKPolyline związane z powiększaniem w MapKit

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 
    } 
} 

Renderowanie polilinii jest bardzo dziwne. Podczas powiększania i przesuwania Możesz zobaczyć niektóre artefakty.

Spójrz na zdjęciach poniżej:

ekran początkowy Initial Screen

po pewnym panoramowanie After some panning

Po pomniejszania i powiększania ponownie After zooming out and zooming in again

Jak rozwiązać ten problem? Próbowałem implementować mój własny renderer, ale jest to ta sama sytuacja. Jak overaly jest buforowany i nie jest przerysowywany na czas. Pracuję na iOS 10, iPhone 6, Simulator z iOS SDK 10 Xcode 8.

+0

Zobacz tę odpowiedź http://stackoverflow.com/questions/20601768/mkpolylinerenderer-produces-jagged-unequal-paths – doogi

+0

Miałem ten sam problem i naprawiłem go: http://stackoverflow.com/questions/40087736/ios- 10-mapkit-poprzednia-warstwa-zoom-issue – fatinho

+0

Nie ma poprawnego rozwiązania tego problemu i nie znaleziono rozwiązania. ktoś inny ? – Kumar

Odpowiedz

3

Swift 3 Rozwiązanie:

utworzyć podklasę 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) 
     } 
    } 
} 

następnie używać go w swojej rendererFor MapKit delegat:

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

Twoje polilinie nie spowoduje ponowne renderowanie po powiększanie unikając artefaktów

+0

To faktycznie działa. Ale upewnij się, że ustawiłeś renderer.lineWidth na wysoką wartość, inaczej nie zobaczysz polilinii. Zmieniłem klasę niestandardową, ustawiając ctx.setLineWidth (self.lineWidth * 100). W ten sposób nie trzeba ustawiać bardzo wysokiej wartości w metodzie delegatów. – FredFlinstone

Powiązane problemy