2012-07-13 2 views
7

필자는 특정 라인 매개 변수로 한 번 그릴 필요가있는 복잡한 UIBezierCurve를 가지고 있으며, 다른 라인 매개 변수로 오버레이로 다시 그려야합니다. 또한 커브의 마지막 부분이 이전보다 약간 짧아야합니다.UIBezierPath를 독립적으로 만드시겠습니까?

이 작업을 수행하려면 마지막 부분까지 addLineToPoint:, moveToPoint:까지 커브를 만든 다음이 커브의 복사본을 만들어 원래 커브와 복사 된 커브에서 선의 마지막 세그먼트를 다르게 추가하고 싶습니다. 그리고 나서 원래의 곡선과 복사 된 곡선을 칠합니다.

문제는 내가 예상 한대로 작동하지 않는다는 것입니다. copyCurve에도 적용된다

UIBezierPath* copyCurve = [originalCurve copy]; 

그리고 그 후 originalCurve에서 수행 도면, 그래서이 곡선의 어떤 독립적 인 드로잉을 할 수 는 I에 의해 곡선의 복사본을 생성한다.

원본과 사본이 연결되는 이유는 무엇이며 어떻게 제거 할 수 있습니까?

편집 1 : 내가 찾은 해결책은 다음과 같은 방법으로 사본 만드는 것입니다 이 제대로 작동하기 때문에

UIBezierPath* copyCurve=[UIBezierPath bezierPathWithCGPath:CGPathCreateMutableCopy(originalCurve.CGPath)]; 

을, 어쩌면 문제는 내가 함께 얻을 복사본의 불변성에

[originalCurve copy] 
+0

당신을 했습니까'alloc' /'초기화 '당신 커브 커브? – Dustin

+0

아니오, 내 질문에 쓰여진 내용은 ... – BartoNaz

답변

19

CGPath를 사용하여 새로운 동일한 경로를 만듭니다.

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath]; 

CGPath 속성 문서가 있음 상태 :

이 속성은 특정 시점에서 경로의 스냅 샷이 포함되어 있습니다. 이 속성을 가져 오면 코어 그래픽 함수에 전달할 수있는 불변 경로 객체가 반환됩니다. 우리가 사용할 수 있습니다 또는

: - : - 또한

+0

제발, 제 질문에 대한 편집을보십시오. 그것은 내가 불변의 경로 객체를 변경할 수 없기 때문에 아마도 나는 가변적 인 객체가 필요할 것이다. – BartoNaz

+2

CGPath는 변경할 수 없지만 CGPath로 만든 UIBezierPath 객체는 변경할 수 있습니다. – jrturton

+0

아니요, 죄송합니다. 실제로 작동한다. 고맙습니다! – BartoNaz

2

이 대답을 @jrturton하는

let path = UIBezierPath(ovalIn: pathRect) 
let newPath = path.cgPath.copy(strokingWithWidth: strokeWidth, lineCap: .butt, lineJoin: .miter, miterLimit: 0) 

enter image description here

Reference

+0

swift 3으로 업데이트하십시오. storkedArc = arc.copy (strokingWithWidth : 5.0, lineCap : .butt, lineJoin : .miter, miterLimit : 10) –

관련 문제