Momentan verfolge ich meinen Standort auf einem MKMapView. Mein Ziel ist es, einen Bezier-Pfad zu erstellen, der mit einem MKPolyline identisch ist, der aus nachverfolgten Orten erstellt wurde.So zeichnen Sie UIBezierPath identisch mit MKPolyline in einer UIView
Was ich versucht habe, ist: Speichern Sie alle Standortkoordinaten in einem CLLocation-Array. Iterieren Sie über dieses Array und speichern Sie die Koordinaten in einem CLLocationCoordinate2D-Array. Stellen Sie dann sicher, dass die Polylinie in der Ansicht des Bildschirms ist, um dann alle Standortkoordinaten in CGPoints zu konvertieren.
Aktuelle Versuch:
@IBOutlet weak var bezierPathView: UIView!
var locations = [CLLocation]() // values from didUpdateLocation(_:)
func createBezierPath() {
bezierPathView.isHidden = false
var coordinates = [CLLocationCoordinate2D]()
for location in locations {
coordinates.append(location.coordinate)
}
let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
fitPolylineInView(polyline: polyline)
let mapPoints = polyline.points()
var points = [CGPoint]()
for point in 0...polyline.pointCount
{
let coordinate = MKCoordinateForMapPoint(mapPoints[point])
points.append(mapView.convert(coordinate, toPointTo: polylineView))
}
print(points)
let path = UIBezierPath(points: points)
path.lineWidth = 2.0
path.lineJoinStyle = .round
let layer = CAShapeLayer(path: path, lineColor: UIColor.red, fillColor: UIColor.black)
bezierPathView.layer.addSublayer(layer)
}
extension UIBezierPath {
convenience init(points:[CGPoint])
{
self.init()
//connect every points by line.
//the first point is start point
for (index,aPoint) in points.enumerated()
{
if index == 0 {
self.move(to: aPoint)
}
else {
self.addLine(to: aPoint)
}
}
}
}
extension CAShapeLayer
{
convenience init(path:UIBezierPath, lineColor:UIColor, fillColor:UIColor)
{
self.init()
self.path = path.cgPath
self.strokeColor = lineColor.cgColor
self.fillColor = fillColor.cgColor
self.lineWidth = path.lineWidth
self.opacity = 1
self.frame = path.bounds
}
}
Ich bin in der Lage der Punkte auf die Konsole ausgegeben, die aus dem convert gespeichert (_ :) Methode (nicht sicher, ob sie korrekt sind). Das Ergebnis wird jedoch nicht im BezierPathView ausgegeben, was zu einem leer-weißen Hintergrund-View-Controller führt.
Sie müssen wahrscheinlich zeigen, wie Sie von GPS-Koordinaten umwandeln zu UIView koordiniert. – MirekE
@MirekE Angepasst jetzt! Ich erhalte die Koordinaten von der CLLocationManagerDelegate-Methode didUpdateLocations. Ich bin in der Lage, eine MKPolyline erfolgreich zu erstellen, ich weiß nur nicht, wie man einen UIBezierPath erstellt, der identisch mit der Polylinie ist, so dass ich ihn in eine UIView oder ein Objekt einfügen kann, um einen Pfad zu repräsentieren. – lifewithelliott
Capture der MKPolyline als Bild, mit http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina-display –