2011-05-26 11 views
5

मैं निम्नलिखित कोड है में CALayer आकर्षित:एक CGContext

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(context); 

CALayer *sublayer = [CALayer layer]; 
sublayer.backgroundColor = [UIColor orangeColor].CGColor; 
sublayer.cornerRadius = 20.0; 
sublayer.frame = CGRectMake(20, 0, 300, 20); 

[sublayer setNeedsDisplay]; 
[sublayer drawInContext:context]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

return newImage; 

लेकिन जब मैं वापसी newImage देखने, वहाँ सिर्फ एक खाली छवि है। जब मैं drawInContext को renderInContext में बदलता हूं, तो मुझे उपरोक्त sublayer मिल गया, लेकिन ऐसा लगता है जैसे समन्वय प्रणाली गड़बड़ है।

कोई विचार क्यों उपर्युक्त पर drawInContext काम नहीं करता है?

उत्तर

3

समन्वय प्रणाली गड़बड़ नहीं है, प्रति से। क्वार्ट्ज UIKit की तुलना में एक अलग समन्वय प्रणाली का उपयोग करता है। क्वार्ट्ज में, वाई-अक्ष फ़्रेमिंग आयत के निचले बाएं हिस्से में निकलती है। जब आप आयताकार "ऊपर" यात्रा करते हैं तो मूल्य बड़े हो जाते हैं। एक दृश्य प्रतिनिधित्व के लिए,

http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html

यह है कि UIKit की प्रणाली मूल समन्वय में UIKit से अलग है पर दस्तावेज़ देखें है ऊपरी बाएं भाग के रूप में आप "नीचे" यात्रा y- अक्ष मूल्यों और अधिक सकारात्मक बनने के साथ।

क्यों drawInContext: काम नहीं करता है, आपको कैलियर क्लास के दस्तावेज़ों का भी संदर्भ देना चाहिए, जहां यह कहता है, "डिफ़ॉल्ट कार्यान्वयन कुछ भी नहीं करता है।"

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html

2

drawInContext के स्थान पर renderInContext का उपयोग करें।

मेरी समझ यह है कि drawInContext ओवरराइड होने के लिए है, जबकि renderInContext संदर्भ में परत की सामग्री को प्रस्तुत करने के लिए उपयोग किया जाता है।

the documentation से

:

- drawInContext:

इस विधि के डिफ़ॉल्ट कार्यान्वयन किसी भी खुद को ड्राइंग कर नहीं करता है। यदि परत का प्रतिनिधि drawLayer:inContext: विधि लागू करता है, तो उस विधि को वास्तविक ड्राइंग करने के लिए कहा जाता है।

सबक्लास इस विधि को ओवरराइड कर सकते हैं और परत की सामग्री को आकर्षित करने के लिए इसका उपयोग कर सकते हैं। ड्राइंग करते समय, सभी निर्देशांक तार्किक समन्वय अंतरिक्ष में बिंदुओं में निर्दिष्ट किए जाने चाहिए।


- renderInContext:

इस विधि परत पेड़ से सीधे प्रस्तुत हुई है, किसी भी एनिमेशन के पेड़ प्रस्तुत करना करने के लिए जोड़ा अनदेखी। परत के समन्वय अंतरिक्ष में प्रस्तुतकर्ता।

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