2012-11-24 11 views
7

Aight का उपयोग कर एक त्रिकोण गोलाकार कोनों के साथ आकर्षित करने के लिए कैसे तो मैं तो जैसे एक त्रिकोण आकर्षित करने के लिए करना चाहते हैं:quartz2d/CoreGraphics

rounded triangle

वर्तमान में मैं एक CAShapeLayer के संयोजन का उपयोग कर रहा हूँ और साथ पथ बनाने एक UIBezierPath (कोड नीचे है) और उसके बाद इसे एक अन्य परत के लिए मुखौटा के रूप में लागू करना (self.layer जैसा कि मैं UIView उपclass में हूं और लेयरक्लास सेट करने के बजाय मैं इसे इस तरह से कर रहा हूं ताकि मैं प्रारंभिक परत को संरक्षित कर सकूं)

वैसे भी कोड:

_bezierPath = [[UIBezierPath bezierPath] retain]; 
#define COS30 0.86602540378 
#define SIN30 0.5 
[_bezierPath moveToPoint:(CGPoint){self.frame.size.width/2.f-r*SIN30,r*COS30}]; 
[_bezierPath addArcWithCenter:(CGPoint){self.frame.size.width/2.f,r*COS30*2.f} radius:r startAngle:2*M_PI/3.f endAngle:M_PI/3.f clockwise:YES]; 
[_bezierPath addLineToPoint:(CGPoint){self.frame.size.width-r*SIN30,self.frame.size.height-r*COS30}]; 
[_bezierPath addArcWithCenter:(CGPoint){self.frame.size.width-r*SIN30-r,self.frame.size.height-r*COS30} radius:r startAngle:0.f endAngle:-M_PI/3.f clockwise:YES]; 
[_bezierPath addLineToPoint:(CGPoint){r*SIN30,self.frame.size.height-r*COS30}]; 
[_bezierPath addArcWithCenter:(CGPoint){r*SIN30+r,self.frame.size.height-r*COS30} radius:r startAngle:4*M_PI/3.f endAngle:M_PI clockwise:YES]; 
[_bezierPath closePath]; 
CAShapeLayer *s = [CAShapeLayer layer]; 
s.frame = self.bounds; 
s.path = _bezierPath.CGPath; 
self.layer.mask = s; 
self.layer.backgroundColor = [SLInsetButton backgroundColorForVariant:SLInsetButtonColorForSLGamePieceColor(_color)].CGColor; 

और दुर्भाग्य से परिणाम नहीं है कि मैं क्या, के लिए देख रहा था थोड़ा घुंडी बजाय कोनों बन (जैसे कि इसकी बहुत ज्यादा बदल)

धन्यवाद अग्रिम में

+0

क्यों क्योंकि (30) और नहीं 60? – AlexWien

+0

किस मामले में आप जिक्र कर रहे हैं? – DanZimm

उत्तर

14

एक शानदार दोस्त (जॉन हीटन मामले में आप उसके अंदर भागते हैं, वह बहुत बढ़िया है) मुझे लाइन कैप और लाइन जोइन गुणों को याद दिलाता है जो मूल ग्राफिक्स तैनात करते हैं।

कहीं:

#define border (10.f) 

और अपने इंटरफेस में:

CGFloat inset = border/2.f; 
UIBezierPath *bezierPath = [UIBezierPath bezierPath]; 
[bezierPath moveToPoint:(CGPoint){ self.frame.size.width/2.f, inset }]; 
[bezierPath addLineToPoint:(CGPoint){ self.frame.size.width - inset, self.frame.size.height - inset }]; 
[bezierPath addLineToPoint:(CGPoint){ a, self.frame.size.height - a }]; 
[bezierPath closePath]; 

self.bezierPath = bezierPath; 

और फिर अपने drawRect: विधि में:

@property (nonatomic, strong) UIBezierPath *bezierPath; 

और अपने init में, इस तरह एक छोटी पथ बना निम्न की तरह कुछ करें:

CGContextRef c = UIGraphicsGetCurrentContext(), context = c; 
CGColorRef col = [UIColor redColor].CGColor; 
CGColorRef bcol = [UIColor redColor].CGColor; 
CGContextSetFillColorWithColor(c, col); 
CGContextSetStrokeColorWithColor(c, bcol); 
CGContextSetLineWidth(c, border); 
CGContextSetLineJoin(c, kCGLineJoinRound); 
CGContextSetLineCap(c, kCGLineCapRound); 
CGContextAddPath(c, self.bezierPath.CGPath); 
CGContextStrokePath(c); 
CGContextAddPath(c, self.bezierPath.CGPath); 
CGContextFillPath(c); 

और वह ठीक से दे देंगे आप विकल्प के साथ भी एक त्रिकोण पर कोने गोल, एक सीमा है या की रूपरेखा तैयार करने

+0

'const' के साथ' # परिभाषित' को बदलने पर विचार करें! –

+0

मैंने 'स्थिर कॉन्स' जैसी किसी चीज के विरोध में मैक्रो का उपयोग करना चुना क्योंकि आपको कभी भी पॉइंटर के साथ संख्या को संदर्भित करने की आवश्यकता नहीं है, अतिरिक्त प्रकार की जांच यहां अनावश्यक है (इसका उपयोग एक दिनचर्या में किया जाता है जो इसे मानता है एक फ्लोट) और यह क्ली के तर्कों के साथ या xcode की कॉन्फ़िगरेशन के साथ संकलन समय पर इस स्थिरता को आपूर्ति करने की क्षमता खोलता है (नाम 'सीमा' का नाम सबसे अच्छा नहीं है और इसे बदला जाना चाहिए, लेकिन यह कोड बस प्रतिलिपि/चिपकाया और पढ़ना चाहिए और इसके बारे में सोचा जाना चाहिए)। – DanZimm

+0

मैं समझता हूं, लेकिन मैक्रो बदल गया है, लेकिन पूरी परियोजना recompiled नहीं है? –