2017-01-17 5 views
0

いくつかの通過点を使用して破線のUIBezierPathを作成します。破線のUIBezierPathサブパスジャンクション

let pathLayer = CAShapeLayer() 
pathLayer.strokeColor = UIColor.blue.cgColor 
pathLayer.lineWidth = 3.0 
pathLayer.fillColor = UIColor.clear.cgColor 
pathLayer.lineDashPattern = [5.0, 2.0] 
pathLayer.lineDashPhase = 0 

let path = PathCreator.createPath(resultPoints) 

pathLayer.path = path.cgPath 

私はPathCreatorを簡略化してきましたが、完全にそれがこの

PathCreator { 
    func createPath(resultPoints: [CGPoint]) -> UIBezierPath { 
     let path = UIBezierPath() 
     for i in 0..<(resultPoints.count-1) { 
      if resultPoints[i] is CircleCenterPoint { 
       continue 
      } 
      if resultPoints[i] is ArcEndPoint { 
       path.move(to: resultPoints[i].cg()) 
       path.addLine(to: resultPoints[i+1].cg()) 
      } 
      if let arcStartPoint = resultPoints[i] as? ArcStartPoint, 
       let circleCenterPoint = resultPoints[i+1] as? CircleCenterPoint, 
       let arcEndPoint = resultPoints[i+2] as? ArcEndPoint { 
       path.addArc(withCenter: circleCenterPoint.cg(), 
       radius: circleCenterPoint.radius, 
       startAngle: arcStartPoint.arcStartAngle, 
       endAngle: arcEndPoint.arcEndAngle, 
       clockwise: circleCenterPoint.clockwise) 
      } else { 
       path.move(to: resultPoints[i].cg()) 
       path.addLine(to: resultPoints[i+1].cg()) 
      } 
     } 
     return path 
    } 
} 

のようになります。しかし、時には、私はサブパスの接合部に問題を抱えている:

path example

私は何行方不明?

+0

余分な長いダッシュは、1つのパスの終わりと次のパスの始まりの組み合わせですか?その場合は、ループ内の各パスの最後に余分な空白スペースを追加してください。私はそれが問題であるとは確信していませんが、私はちょうど絵を見て私の推測だろう。 – Pierce

+0

はい、これが問題です。しかし、私は余分なスペースを追加すると、私はポイントの起源を再計算する必要があります、そして私はそれが真の方法ではないと信じて) –

+0

多分1つの単一のパスとしてすべてのこのルートを描くようにアイオスを教える方法がありますか?だから、iosは必要なときにダッシュを計算するでしょう –

答えて

0

CAShapeLayerは単一パスなので、パスのlineJoinプロパティを設定するだけです。あなたの場合、私はkCALineJoinRoundが動作すると思います。 Possible line join values.

pathLayer.lineJoin = kCALineJoinRound 
+0

何も変更されていません:( 多分、このルートを1つの単一パスとして描画する方法がありますか? –

+0

それは私にとってはうまくいく方法です - 単一のパスを描きます(ええ、矩形を掘る)、CAShapeLayer closePath()を実行するだけです。 – dfd

+0

close()は、奇妙な行を追加しています:)ドキュメントでは「このメソッドは現在のコードを閉じますサブパス内の最初の点と最後の点の間に線分を作成することで、現在の点を新たに作成された線分の最後に更新します。 –