2012-07-13 16 views
7

मेरे पास एक जटिल UIBezierCurve है जिसे मुझे कुछ विशेष लाइन पैरामीटर के साथ एक बार आकर्षित करने की आवश्यकता है, और फिर इसे अन्य लाइन पैरामीटर के साथ ओवरले के रूप में फिर से खींचें, लेकिन मुझे वक्र के अंतिम भाग को पिछले एक की तुलना में थोड़ा छोटा होना चाहिए।UIBezierPath की स्वतंत्र प्रति बनाएं?

इस मैं addLineToPoint: द्वारा वक्र बनाना चाहते हैं करने के लिए, moveToPoint: अंतिम भाग से ऊपर है, तो इस वक्र की एक प्रतिलिपि बनाने और मूल और प्रतिलिपि बनाई घटता में अलग लाइन के अंतिम खंड जोड़ें। और फिर मैं मूल वक्र, और नकल एक स्ट्रोक।

समस्या यह है कि यह मेरी अपेक्षा के अनुसार काम नहीं करता है। मैं द्वारा वक्र की एक प्रतिलिपि बनाने:

UIBezierPath* copyCurve = [originalCurve copy]; 

और ड्राइंग जो मुझे लगता है कि बाद originalCurve में करते हैं, copyCurve को भी लागू किया जाता है, इसलिए मैं इस घटता से किसी के लिए स्वतंत्र ड्राइंग नहीं कर सकते।

मूल और प्रतिलिपि के बीच इस संबंध का कारण क्या है और मैं इससे कैसे छुटकारा पा सकता हूं?

संपादित करें 1: एक समाधान है जो मैंने पाया निम्नलिखित तरीके से प्रतिलिपि बनाने के लिए है:

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

चूंकि यह ठीक से काम करता है, शायद समस्या प्रतिलिपि मैं के साथ मिल की अचल में है

[originalCurve copy] 
+0

आप क्या 'alloc' /' init 'आपकी प्रतिलिपि? – 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

इसे स्विफ्ट 3 के लिए अपडेट करें storkedArc = arc.copy (strokingWithWidth: 5.0, lineCap: .butt, lineJoin: .miter, miterLimit: 10) –

संबंधित मुद्दे