2010-02-23 14 views
10

मेरे ऐप में मैं पथ के साथ पाठ प्रस्तुत करने की कोशिश कर रहा हूं; यह अधिकांश पात्रों के लिए ठीक है लेकिन जापानी (या कुछ भी गैर मैक-रोमन) के लिए नहीं है। मुझे [NSString drawAtPoint] का उपयोग करने की सलाह दी गई है जो मेरे CATiledLayer में सही वर्ण प्रदर्शित करता है; हालांकि, वे लगभग 5 सेकंड के बाद गायब हो जाते हैं। इस समय मैं परत को ज़ूम कर सकता हूं और वे ठीक से स्केल कर सकते हैं, लेकिन वे आमतौर पर शेष पाठ की तरह कैटिल्डलेयर के लिए प्रतिबद्ध नहीं लगते हैं।CGContextShowGlyphsAtPoint समस्याओं के स्थान पर NSString की drawAtPoint विधि का उपयोग

प्रस्तुत करने से पहले, मैं स्ट्रिंग की जांच करता हूं और यह तय करता हूं कि उनमें से कोई भी प्रस्तुत करने योग्य नहीं होगा। मैं मुद्दे हैं करने जा रहा हूँ, मैं drawAtpoint बजाय का उपयोग करें:

if (!isFullyDisplayable) 
{ 
    CGContextShowGlyphsAtPoint(context, pt.x, pt.y, realGlyph, 1); 
} 
else { 
    // fall back on less flexible font rendering for difficult characters 

    NSString *b = [gv text]; 
    NSString *c = [b substringWithRange:NSMakeRange(j,1)]; 

    [c drawAtPoint:pt withFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]]; 


} 

किसी को भी क्यों पाठ गायब हो जाता है के बारे में कोई संकेत है?

जैसे ही drawAtPoint मेरी डिबग आउटपुट प्रयोग किया जाता है से भर जाता है:

<Error>: CGContextGetShouldSmoothFonts: invalid context 
<Error>: CGContextSetFont: invalid context 
<Error>: CGContextSetTextMatrix: invalid context 
<Error>: CGContextSetFontSize: invalid context 
<Error>: CGContextSetTextPosition: invalid context 
<Error>: CGContextShowGlyphsWithAdvances: invalid context 

तो मैं इसे अपने संदर्भ प्रबंधन के साथ कुछ है अनुमान लगा रहा हूँ, लेकिन मैं मान लिया है कि अगर यह एक ही है जैसा कि मैं CGContextShowGlyphsAtPoint का उपयोग करता हूं, इसमें पहले से ही सही संदर्भ होना चाहिए?

उत्तर

17

मेरे अपने प्रश्न का उत्तर देना:

NSString drawAtPoint: withFont: संदर्भ ढेर का उपयोग करता है, और जहां मैं इस विधि बुला रहा था से ढेर खाली था।

UIGraphicsPushContext(context); and UIGraphicsPopContext(); 

चाल के साथ कॉल को लपेटना।

+1

आपको यह उल्लेख करना चाहिए कि यह केवल आईओएस 4.0 और बाद में काम करता है। UIKit ग्राफ़िक एक्सटेंशन पुराने FWs में थ्रेड-सुरक्षित नहीं हैं। – Split

1

पूर्णता के लिए, कोको के लिए आवश्यक कोड यहां दिया गया है। इसके अलावा .drawInRect साथ काम करता है ...

CGContextSaveGState(context) 
let old_nsctx = NSGraphicsContext.currentContext() // in case there was one 
// force "my" context... 
NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: context, flipped: true)) 

// Do any rotations, translations, etc. here 
str.drawAtPoint(cgPt, withAttributes: attributes) 

NSGraphicsContext.setCurrentContext(old_nsctx)// clean up for others 
CGContextRestoreGState(context) 

यह ज्यादातर की जरूरत नहीं है, के रूप में @davbryn कहते हैं, के रूप में सामान्य रूप से वहाँ पहले से ही है एक "काम" स्टैक पर संदर्भ है कि एक ही (आप उम्मीद!) के रूप में है आपका संदर्भ, हालांकि, जैसा कि वह बताता है, कभी-कभी नहीं होता है। मैंने विशेष रूप से MapKit MKOverlayRenderer के drawMapRect: के साथ इस समस्या की खोज की, जो संदर्भ को स्पष्ट रूप से सेट किए बिना टेक्स्ट नहीं दिखाएगा।