2016-10-25 9 views
9

У меня очень простой View Controller, чтобы продемонстрировать это странное поведение рендеринга MKPolyline. Ничего особенного, просто обычные вызовы api.MKPolyline странный рендеринг, связанный с масштабированием в 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 
    } 
} 

Проведение полилинии очень странно. Во время масштабирования и панорамирования вы можете увидеть некоторые артефакты.

Взгляните на фотографии ниже:

Начальный экран Initial Screen

После некоторых панорамирование After some panning

После увеличения и уменьшения масштаба масштабирования снова After zooming out and zooming in again

Как это исправить? Я пытался реализовать свой собственный рендерер, но в той же ситуации. Подобно overaly, кэшируется и не перерисовывается вовремя. Я работаю над прошивкой 10, iPhone 6, симулятор от IOS SDK 10 Xcode 8.

+0

См. Этот ответ http://stackoverflow.com/questions/20601768/mkpolylinerenderer-produces-jagged-unequal-paths – doogi

+0

У меня была такая же проблема и исправлено это с помощью этого: http://stackoverflow.com/questions/40087736/ios- 10-mapkit-previous-layer-zoom-issue – fatinho

+0

Нет подходящего решения для этой проблемы и не нашел решения. кто-нибудь еще ? – Kumar

ответ

3

Swift 3 Решение:

Создать подкласс 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) 
     } 
    } 
} 

Затем используйте его в rendererFor MapKit делегат:

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

Ваши полилинии не будет вновь сделать после того, как масштабирование, таким образом избегая артефактов

+0

Это действительно работает. Но убедитесь, что вы установили значение renderer.lineWidth в высокое значение, иначе вы не увидите полилинию. Я изменил свой собственный класс, установив ctx.setLineWidth (self.lineWidth * 100). Таким образом, вам не нужно устанавливать очень большое значение в методе делегата. – FredFlinstone

 Смежные вопросы

  • Нет связанных вопросов^_^