2013-04-24 12 views
20

मैं बना रहा हूं ताकि UIView की परत के लिए मुखौटा के रूप में उपयोग किया जा सके। मैं आकार परत खींचने के लिए UIBezierPath का उपयोग कर रहा हूं। यह ठीक काम कर रहा है, सिवाय इसके कि मुझे आकर्षित होने पर कुछ अजीब परिणाम मिल रहे हैं। ज्यामिति अपेक्षित व्यवहार नहीं कर रहा है। मैं ऊपरी दाएँ कोने में सरल "पाई टुकड़ा" आकर्षित करने के लिए कोशिश कर रहा हूँ:addArcWithCenter को एक डिग्री देने के लिए 0 डिग्री का कोण क्यों 90 डिग्री से शुरू होता है?

#define degreesToRadians(x) ((x) * M_PI/180.0) 

... 

// "layer" refer's to the UIView's root layer 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 

maskLayer.frame = 
    layer.presentationLayer ? 
    ((CAGradientLayer *)layer.presentationLayer).bounds : layer.bounds; 
maskLayer.fillRule = kCAFillRuleEvenOdd; 
maskLayer.needsDisplayOnBoundsChange = YES; 

CGFloat maskLayerWidth = maskLayer.bounds.size.width; 
CGFloat maskLayerHeight = maskLayer.bounds.size.height; 
CGPoint maskLayerCenter = 
    CGPointMake(maskLayerWidth/2,maskLayerHeight/2); 

UIBezierPath *path = [UIBezierPath bezierPath]; 

[path moveToPoint:maskLayerCenter]; 

[path addArcWithCenter:maskLayerCenter radius:(maskLayerWidth/2) 
startAngle:degreesToRadians(0) endAngle:degreesToRadians(90) clockwise:YES]; 

[path closePath]; 


maskLayer.path = path.CGPath; 

layer.mask = maskLayer; 

अंतिम परिणाम है कि एक पाई टुकड़ा नीचे दाएं कोने में तैयार की है है। चाप का पहला बिंदु 90 डिग्री पर खींचा जाता है, फिर 180 तक। यह ऐसा क्यों करता है भले ही मैं 0 और 9 0 डिग्री कोण का उपयोग कर रहा हूं?

उत्तर

67

यह छवि सीधे the documentation से आता है।

image

और वहाँ यह कैसे काम करता की चर्चा (डिफ़ॉल्ट समन्वय प्रणाली को देखते हुए)

चर्चा
इस विधि निर्दिष्ट चाप वर्तमान बिंदु पर शुरुआत जोड़ता है। निर्मित आर्क निर्दिष्ट सर्कल के परिधि पर स्थित है। डिफ़ॉल्ट समन्वय प्रणाली में खींचे जाने पर, प्रारंभ और अंत कोण में दिखाए गए यूनिट सर्कल पर आधारित होते हैं चित्र 1। उदाहरण के लिए, 0 रेडियंस का प्रारंभ कोण निर्दिष्ट करना, π रेडियंस का एक अंतिम कोण, और घड़ी के पैरामीटर को YES पर सेट करना सर्कल के निचले भाग को खींचता है। हालांकि, एक ही प्रारंभ और अंत कोण निर्दिष्ट करना, clockwise पैरामीटर सेट NO को सर्कल के शीर्ष भाग को खींचता है।

इस प्रकार कोण addArcWithCenter:radius:startAngle:endAngle:clockwise: के लिए काम करते हैं। यदि वह नहीं है जो आप देख रहे हैं तो आप अपने कोणों की गलत गणना कर रहे हैं।

9

चित्रा bezierPathWithArcCenter:radius:startAngle:endAngle:clockwise: दस्तावेज में 1 पर एक नज़र डालें: एक "पाई टुकड़ा" ऊपरी दाहिने कोने में के लिए आप मापदंडों

startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES 

उपयोग करने के लिए (कारण यह है कि डिफ़ॉल्ट समन्वय है आईओएस पर सिस्टम में एक्स-अक्ष दाएं ओर इशारा करते हैं, और एक वाई-अक्ष इंगित करता है।)

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