2017-01-31 5 views
2

現在、私はMKMapViewで自分の位置を追跡しています。私の目的は、追跡された場所から作成されたMKPolylineと同じベジェパスを描くことです。UIViewでMKPolylineと同じUIBezierPathを描画する方法

私が試みたことは次のとおりです。すべての位置座標をCLLocation配列に格納する。その配列を繰り返し、CLLocationCoordinate2D配列にlat/lng座標を格納します。次に、ポリラインが画面のビューにあることを確認して、CGPoints内のすべての位置座標を変換します。

現在の試行:

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

私は変換(_ :)メソッド)彼らが正しいか(わからないから保存されたコンソールにポイントを出力することができるしています。しかし、bezierPathViewには出力がありません。空白の背景ビューコントローラーになります。

+0

あなたは、おそらくあなたは、GPSからの変換方法を示す必要がある座標のUIViewに調整します。 – MirekE

+0

@MirekE調整済みです!私はCLLocationManagerDelegateメソッドdidUpdateLocationsから座標を取得しています。私はMKPolylineを正常に作成することができました。私は、ポリラインと同じUIBezierPathを作成する方法を知らないので、UIViewまたはいくつかのオブジェクトをパスを表すために配置できます。 – lifewithelliott

+0

MKPolylineをイメージとしてキャプチャします。http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-with-loss-of-quality-on-retina-display –

答えて

1

拡張機能は正常に動作します。この問題は、表示されていないビューにレイヤーを追加するコードにある可能性があります。

私はあなたのプロジェクトを単純化することをお勧めします。たとえば、あなたのビューに間違いなくあらかじめ定義されたポイントの配列を使用することをお勧めします。あなたのストロークと塗りの黒と黄色のような、はっきりと見える

let points = [ 
    CGPoint(x: 10, y: 10), 
    CGPoint(x: 490, y: 10), 
    CGPoint(x: 490, y: 290), 
    CGPoint(x: 10, y: 290), 
    CGPoint(x: 10, y: 10) 
] 

使用色:たとえば、幅の広い500個のピクセルと300個のピクセルの高さのビューのために、あなたのようなものを使用することができます。

例えば、あなたのパスが正しくビューに追加されていることを確認してください:

let path = UIBezierPath(points: points) 

let shapeLayer = CAShapeLayer(path: path, lineColor: UIColor.blue, fillColor: UIColor.lightGray) 

view.layer.addSublayer(shapeLayer) 

は、XcodeののInterface Builderでのビューが含まれているコントローラを点検。デバッグビュー階層の機能では:

enter image description here

+0

私は何が変更できたのか完全にはっきりしません。しかし進歩は間違いなくなされました。より良い表現のために、私はUIViewの背景を透明にしました。今度は、ポリライン全体がビューの境界内に描画されるようにする方法を理解しようとしています。 BezierPathのサイズ、および任意のビューに収まる中心/サイズが可能ですか?私は、ポリラインのポイントをビュー内で再配置できるようになったと思いました。あなたが前に言ったように2000 + xポイントは間違いなく画面から外れています!私のウサギの穴の下であなたをドラッグして申し訳ありません! – lifewithelliott

+0

https://developer.apple.com/reference/uikit/uibezierpath/1624340-apply特許の境界を外れているpointaに対しては、XcodeのInterface Builderのビューを含むコントローラを「デバッグビュー階層」機能で検査します – MirekE

関連する問題