2012-07-13 26 views
7

Tôi có một UIBezierCurve phức tạp mà tôi cần vẽ một lần với một số tham số dòng cụ thể, sau đó vẽ lại thành lớp phủ với các tham số dòng khác, nhưng tôi cũng cần phần cuối của đường cong ngắn hơn một chút so với trước đó.Tạo bản sao độc lập của UIBezierPath?

Để làm điều này, tôi muốn tạo đường cong bằng cách addLineToPoint:, moveToPoint: đến phần cuối cùng, sau đó tạo một bản sao của đường cong này và thêm các đoạn cuối cùng của dòng khác với đường cong gốc và được sao chép. Và sau đó tôi vuốt đường cong gốc và đường cong đã sao chép.

Vấn đề là nó không hoạt động như tôi mong đợi. tôi có thể tạo một bản sao của đường cong theo:

UIBezierPath* copyCurve = [originalCurve copy]; 

Và các bản vẽ mà tôi làm trong originalCurve sau đó, được áp dụng cũng cho copyCurve, vì vậy tôi không thể làm bản vẽ độc lập cho bất kỳ đường cong này.

Lý do cho kết nối này giữa bản gốc và bản sao là gì và làm cách nào để loại bỏ kết nối đó?

EDIT 1: Một giải pháp mà tôi đã tìm thấy là để tạo ra các bản sao theo cách sau:

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

Từ này hoạt động đúng, có lẽ vấn đề là ở tính bất biến của các bản sao tôi nhận được với

[originalCurve copy] 
+0

Bạn có 'alloc'/'init 'copyCurve của bạn? – Dustin

+0

Không, chỉ cần những gì được viết trong câu hỏi của tôi ... – BartoNaz

Trả lời

19

Tạo đường dẫn mới, giống hệt nhau bằng cách sử dụng CGPath.

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath]; 

Các tài liệu hữu CGPath nêu rằng:

Thuộc tính này chứa một bản chụp của con đường tại bất kỳ điểm nào trong thời gian. Bắt thuộc tính này trả về một đối tượng đường dẫn bất biến mà bạn có thể chuyển tới các hàm Core Graphics.

+0

Xin vui lòng, hãy xem chỉnh sửa của tôi về câu hỏi. Dường như với tôi rằng tôi sẽ không thể thay đổi đối tượng đường dẫn bất biến, vì vậy có lẽ tôi cần một cái có thể thay đổi được. – BartoNaz

+2

Bạn không thể thay đổi CGPath, nhưng đối tượng UIBezierPath được thực hiện với CGPath là có thể thay đổi. – jrturton

+0

Không, xin lỗi. Nó thật sự có hiệu quả. Cảm ơn bạn! – BartoNaz

2

Ngoài @jrturton câu trả lời: -

Ngoài ra chúng ta có thể sử dụng: -

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

enter image description here

Reference

+0

cập nhật nó cho nhanh chóng 3 let storkedArc = arc.copy (strokingWithWidth: 5.0, lineCap: .butt, lineJoin: .miter, miterLimit: 10) –

Các vấn đề liên quan