2011-02-11 13 views
5

मैंने पढ़ा है कि मुझे क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड के प्रासंगिक भाग होने का विश्वास है, लेकिन निम्नलिखित का जवाब नहीं मिल रहा है (वे बात नहीं कर रहे हैं दस्तावेज़ में आईओएस के बारे में बहुत कुछ):ऑफ़-स्क्रीन ड्राइंग के लिए UIView से CGLayer कैसे बनाएं

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

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

तब मैं: धारा ऊपर उल्लिखित दस्तावेज़ के पेज 169 पर "एक CGLayer के साथ बैठक" में वर्णित है, मैं एक CGContext में पूरे ड्राइंग है कि मैं एक CGLayer से प्राप्त होता है, तो तरह ड्राइंग के बारे में सोच रहा था इसलिए जैसे विधि,: UIView के drawRect में मेरी UIView में CGContext में ऑफ स्क्रीन मेरी अद्यतन करने कर सकता है और आकर्षित CGLayer

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

समस्या मैं कर रहा हूँ है, जहां मैं से मेरी CGLayer मिलता है ? मेरी समझ है कि मुझे इसे CGLayerCreateWithContext का उपयोग करना है और एक पैरामीटर के रूप में CGContext की आपूर्ति करना है जिससे इसे इसके अधिकांश गुण प्राप्त होते हैं। जाहिर है, सही संदर्भ UIView के संदर्भ हो सकता है, कि मैं

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

साथ हो रही है लेकिन अगर मैं गलत नहीं हूँ, मैं ही नहीं प्राप्त कर सकते हैं के भीतर drawRect: विधि और यह मान लेना कि मान्य नहीं है जिस संदर्भ में मुझे दिया गया है, वही होगा जब अगली बार विधि कहा जाता है, यानी मैं विधि के भीतर स्थानीय रूप से उस CGContext का उपयोग कर सकता हूं।

तो, मैं एक CGContext कि मैं आरंभ करने के लिए उपयोग कर सकते हैं प्राप्त कर सकते हैं मेरी CGLayer एक गुप्त CGContext में आकर्षित करने के लिए बनाने के लिए और फिर मेरी UIView के CGContext में वापस पूरी परत आकर्षित?

पीएस: जबकि आप इसमें हैं; अगर ऊपर कुछ भी समझ में नहीं आता है या नहीं, तो कृपया मुझे बताएं। मैं बस क्वार्ट्ज 2 डी के आसपास अपना सिर लेना शुरू कर रहा हूं।

उत्तर

1

सबसे पहले, यदि आप इसे आईओएस पर्यावरण से कर रहे हैं, तो मुझे लगता है कि आप सही हैं। प्रलेखन स्पष्ट रूप से कहा एक ही तरीका है कि प्राप्त करने के लिए एक CGContextRef है द्वारा

CGContextRef ctx = UIGraphicGetCurrentContext(); 

तो फिर तुम बनाने के लिए इस संदर्भ का उपयोग CGLayer

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL); 

साथ और अगर आपको लगता है कि परत पर आकर्षित करने के लिए चाहते हैं, तो आपके पास इसे परत से प्राप्त संदर्भ के साथ आकर्षित करने के लिए। (यह CGLayer बनाने के लिए पहले आपके द्वारा पारित संदर्भ से कुछ अलग है)। मैं अनुमान लगाता हूं कि CGLayerCreateWithContext उस संदर्भ को सहेजता है जो इसे पारित संदर्भ से प्राप्त कर सकता है, लेकिन सबकुछ नहीं। (उदाहरण में से एक कलरस्पेस जानकारी है, आपको CGLayer से संदर्भ के साथ कुछ भरने पर आपको फिर से निर्दिष्ट करना होगा)।

आप CGLayerGetContext() फ़ंक्शन से CGLayer संदर्भ संदर्भ प्राप्त कर सकते हैं और इसे आकर्षित करने के लिए उपयोग कर सकते हैं।

CGContextRef layerCtx = CGLayerGetContext(layer); 
CGContextBeginPath(layerCtx); 
CGContextMoveToPoint(layerCtx, -10, 10); 
CGContextAddLineToPoint(layerCtx, 100, 10); 
CGContextAddLineToPoint(layerCtx, 100, 100); 
CGContextClosePath(layerCtx); 

एक बिंदु जो मुझे पता चला कि जब आप कुछ ऑफस्क्रीन खींचते हैं, तो यह स्वचालित रूप से ऑफस्क्रीन को क्लिप करता है। (समझ में आता है, इसलिए यह उन चीज़ों को आकर्षित नहीं करता है जो देखा नहीं जाता है) लेकिन जब आप परत को ले जाते हैं (मैट्रिक्स रूपांतरण का उपयोग करके)। क्लिप्ड पथ दिखाना नहीं है (गायब)।

एक आखिरी बात, अगर आप एक चर में एक परत के संदर्भ बचाने के लिए और बाद में आप यह आकर्षित करने के लिए चाहते हैं, आप उपयोग कर सकते हैं CGContextDrawLayerAtPoint() विधि

तरह
CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer); 

यह "stampt" या "से वैसा होगा ड्रॉ "उस न्यूपॉइंटएक्स और नई प्वाइंटवाई समन्वय पर परत खींचें।

मुझे उम्मीद है कि आपके प्रश्न का उत्तर दें, अगर यह नहीं है तो कृपया मुझे बताएं।

+0

मैं सीजीएलयर समस्या से भी अटक गया हूं, मुझे समझ में नहीं आता कि मेरे छुपे हुए कार्यों में इसे कैसे लिखना है, क्या आप कृपया मेरी पोस्ट http://stackoverflow.com/questions/11341763/how-to- उपयोग-cglayer-for-optimal-drawing – Ranjit

+0

CGContextBeginPath() और CGContextClosePath() संदर्भ का पैरामीटर लेते हैं। – Ant

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