2017-01-17 2 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

여분의 긴 대시는 한 경로의 끝과 다음 경로의 시작 부분을 조합 한 것입니까? 그렇다면 루프의 각 경로 끝에 빈 공간을 추가하십시오. 나는 그 문제에 대해 확신하지 못하고 있지만 사진을 보면서 추측 할 수 있습니다. – Pierce

+0

예, 이것이 문제입니다. 하지만 여분의 공간을 추가하면 포인트 기점을 다시 계산해야합니다. 사실이 아니라고 생각합니다. –

+0

아마도이 경로를 하나의 단일 경로로 그리는 방법을 말할 수 있습니까? 그래서 ios는 내가 필요한만큼 대시를 계산할 것입니다 –

답변

0

CAShapeLayer는 단일 경로이므로 경로의 lineJoin 속성을 설정하기 만하면됩니다. 귀하의 경우에는 kCALineJoinRound가 작동한다고 생각합니다. Possible line join values.

pathLayer.lineJoin = kCALineJoinRound 
+0

아무것도 변경되지 않았습니다. ( 어쩌면 거기에 하나의 경로로 모든 경로를 그려 줄 수있는 방법이 있습니까? –

+0

그것이 나를 위해 작동하는 방법 - 단일 경로를 그립니다 (예, 광산 사각형), 그것을 CAShapeLayer로 바꾸십시오 , lineJoin과 함께 대시 패턴을 정의하십시오. 내 코드에서 볼 수있는 유일한 차이점은 closePath()입니다. – dfd

+0

close()는 더 이상한 선을 추가합니다. 문서에서 "이 메서드는 현재를 닫습니다. 서브 패스의 첫 번째 점과 마지막 점 사이에 선 세그먼트를 작성하여이 서브 경로를 생성합니다.이 방법은 현재 닫힌 서브 경로의 첫 번째 점인 새로 작성한 선분의 끝으로 현재 점을 업데이트합니다. " –