2012-07-06 8 views

उत्तर

5

मैं आज रात एक ही चीज़ में भाग गया। सीजी गैर-परिपत्र चाप खींचने का एक आसान तरीका प्रदान नहीं करता है, लेकिन आप इसे CGPath और उपयुक्त परिवर्तन मैट्रिक्स का उपयोग करके कर सकते हैं। मान लीजिए कि आप बाईं ओर, ऊपर और चौड़ाई, ऊंचाई के साथ शुरू होने वाली अक्ष-संरेखित अंडाकार का एक चाप चाहते हैं। तो फिर तुम कुछ इस तरह कर सकते हैं:

CGFloat cx = left + width*0.5; 
CGFloat cy = top + height*0.5; 
CGFloat r = width*0.5; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGAffineTransform t = CGAffineTransformMakeTranslation(cx, cy); 
t = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, height/width), t); 
CGPathAddArc(path, &t, 0, 0, r, startAngle, endAngle, false); 
CGContextAddPath(g->cg, path); 

CGContextStrokePath(g); 

CFRelease(path); 

ध्यान दें कि यदि आप एक पाई के आकार कील आकर्षित करने के लिए चाहते हैं, तो बस के चारों ओर "CGContextAddPath" (, cy cx) एक CGContextMoveToPoint साथ फोन और एक CGContextAddLineToPoint (CX, cy), और CGContextStrokePath के बजाय CGContextFillPath का उपयोग करें। (या यदि आप एक ही समय में भरना और स्ट्रोक करना चाहते हैं, तो CGContextDrawPath का उपयोग करें।)

+0

बहुत अच्छा काम करता है - एनबी: मैंने जो गलती की है उसे मत बनाओ :)। CGAffineTransformMakeTranslation * आवश्यक * है यदि आप MoveToPoint का उपयोग कर रहे हैं (क्योंकि वक्र मूल पर होने पर ट्रांसफॉर्म टी को लागू किया जाना चाहिए, या अन्यथा ऐप्पल का स्केल ट्रांसफॉर्म भी आपके ऑफ़सेट को मूल से गुणा करेगा!) – Adam

+0

ध्यान दें कि यह भी होगा स्ट्रोक चौड़ाई पैमाने पर। – Grodriguez

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