2010-12-08 19 views
6

के साथ ड्राइंग टेक्स्ट मुझे एक CGContext में केंद्रित टेक्स्ट खींचने की आवश्यकता है।कोर ग्राफिक्स

मैंने कोको दृष्टिकोण से शुरुआत की। मैं पाठ के साथ एक NSCell बनाया है और वह इस प्रकार आकर्षित करने के लिए करने की कोशिश की:

NSGraphicsContext* newCtx = [NSGraphicsContext 
    graphicsContextWithGraphicsPort:bitmapContext flipped:true]; 
[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext:newCtx]; 
[pCell setFont:font]; 
[pCell drawWithFrame:rect inView:nil]; 
[NSGraphicsContext restoreGraphicsState]; 

लेकिन CGBitmapContext पाठ उस पर प्रदान की गई है करने के लिए प्रतीत नहीं होता। संभवतः क्योंकि मुझे inView: पैरामीटर के लिए शून्य पास करना है।

तो मैं कोर ग्राफिक्स के लिए पाठ प्रतिपादन स्विचन की कोशिश की:

सबसे आसान तरीका है अपने उपसंहार नाम का उपयोग कर एक फ़ॉन्ट का चयन करने के CGContextSelectFont उपयोग करने के लिए हो रहा है, और बिंदु आकार, लेकिन CGContextShowTextAtPoint केवल गैर-यूनिकोड वर्ण लेता है, और पाठ को एक आयताकार में फिट करने का कोई स्पष्ट तरीका नहीं है: या आयत को मैन्युअल रूप से निकालने के लिए टेक्स्ट की एक पंक्ति के विस्तार की गणना करने के लिए कोई स्पष्ट तरीका नहीं है।

फिर, एक CGFont है जिसे बनाया जा सकता है, और cia CGContextSetFont सेट करें। इस पाठ को चित्रित करने के लिए CGContextShowGlyphsAtPoint की आवश्यकता है, लेकिन फिर से CGContext में जेनरेट किए गए टेक्स्ट के बाउंडिंग रेक्ट की गणना करने के लिए फ़ंक्शन की कमी हो रही है, या पाठ को एक रेक्ट में लपेटना है। इसके अलावा एक स्ट्रिंग को CGGlyphs की सरणी में बदलने के लिए कैसे स्पष्ट नहीं है।

अगला विकल्प स्ट्रिंग को प्रस्तुत करने के लिए CoreText का उपयोग करने का प्रयास करना है। लेकिन कोर टेक्स्ट क्लासेस बेहद जटिल हैं, और ऐसे नमूने हैं जो टेक्स्ट को प्रदर्शित करने के तरीके को दिखाते हैं, एक निर्दिष्ट फ़ॉन्ट में, एक रेक्ट में, कोई नमूने नहीं दिखाते हैं कि कोरटेक्स्ट स्ट्रिंग के बाउंडिंग रेक्ट की गणना कैसे करें।

तो:

  • को देखते हुए एक CGFont एक CGContext कैसे करना है मैं गणना कुछ पाठ का सीमा रेक्ट, और कैसे मैं CGGlyphs की एक सरणी में एक पाठ स्ट्रिंग को बदलने करते हैं?
  • एक स्ट्रिंग, एक CGContext और एक पोस्टस्क्रिप्ट नाम और बिंदु आकार को देखते हुए, स्ट्रिंग के बाउंडिंग रेक्ट की गणना करने के लिए मुझे कोर टेक्स्ट ऑब्जेक्ट्स बनाने की आवश्यकता है, और/या CGContext पर एक रेक्ट पर लिपटे स्ट्रिंग को खींचें।
  • एक स्ट्रिंग और एनएसफ़ॉन्ट को देखते हुए - मैं स्ट्रिंग को एक CGBitmapContext पर कैसे प्रस्तुत करूं? मैं पहले से ही जानता हूं कि इसके विस्तार कैसे प्राप्त करें।
+0

क्या आप वांछित परिणाम का उदाहरण आकर्षित कर सकते हैं? – hfossli

+0

शायद, लेकिन वांछित परिणाम बेहद सरल है - मैं एक पंख में एक फ़ॉन्ट (चेहरे और बिंदु आकार) के साथ एक स्ट्रिंग खींचना चाहता हूं। स्ट्रिंग को लपेटा जाना चाहिए, और मुझे यह चुनने में सक्षम होना चाहिए कि रेखाएं बाएं, मध्य, या दाएं गठबंधन हैं, और पैराग्राफ शीर्ष, केंद्र या नीचे गठबंधन भी है। –

उत्तर

6

मैं आपके उपर्युक्त दृष्टिकोण के साथ जारी रखूंगा लेकिन इसके बजाय एनएसएट्रिब्यूटेड स्ट्रिंग का उपयोग करूंगा।

NSGraphicsContext* newCtx = [NSGraphicsContext graphicsContextWithGraphicsPort:bitmapContext flipped:true]; 
[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext:newCtx]; 
NSAttributedString *string = /* make a string with all of the desired attributes */; 
[string drawInRect:locationToDraw]; 
[NSGraphicsContext restoreGraphicsState]; 
6

अंत में खोज के 4 दिनों के बाद मुझे जवाब मिल गया। मैं वास्तव में चाहता हूं कि ऐप्पल बेहतर दस्तावेज़ीकरण करे। तो यहां हम

मानते हैं कि आपके पास पहले से ही CGFontRef है। अगर मुझे नहीं पता कि मैं आपको बताऊंगा कि संसाधन बंडल से सीजीएफन्ट्रफ में एक टीटीएफ कैसे लोड किया जाए।

नीचे किसी भी स्ट्रिंग की सीमा की गणना करने के कोड का टुकड़ा किसी भी CGFontref

 int charCount = [string length]; 
     CGGlyph glyphs[charCount]; 
     CGRect rects[charCount]; 

     CTFontGetGlyphsForCharacters(theCTFont, (const unichar*)[string cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, charCount); 
     CTFontGetBoundingRectsForGlyphs(theCTFont, kCTFontDefaultOrientation, glyphs, rects, charCount); 

     int totalwidth = 0, maxheight = 0; 
     for (int i=0; i < charCount; i++) 
     { 
      totalwidth += rects[i].size.width; 
      maxheight = maxheight < rects[i].size.height ? rects[i].size.height : maxheight; 
     } 

     dim = CGSizeMake(totalwidth, maxheight); 

पुन: उपयोग के साथ एक ही समारोह CTFontGetGlyphsForCharacters ग्लिफ़ प्राप्त करने के लिए है। एक CGFontRef से एक CTFontRef प्राप्त करने के लिए उपयोग करें CTFontCreateWithGraphicsFont() फ़ंक्शन

यह भी याद रखें NSFont और CGFontRef टोल फ्री पाट कर रहे हैं, जिसका अर्थ है कि वे एक दूसरे में casted सकते हैं और वे किसी भी अतिरिक्त कार्य के बिना समेकित रूप से काम करेंगे।

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