2012-05-16 12 views
5

याद आ रही है यहाँ कोड मैं कोर ग्राफिक्स में कुछ पाठ को दिखाने के लिए उपयोग करें:कोर ग्राफिक्स पाठ रास्ता कोर पाठ की तुलना में तेजी है - मुझे लगता है कि मैं कुछ

int y = MESSAGE_FRAME.origin.y + 8; 

if (month) y = y + 27; 
int height = [JHomeViewCellContentView heightOfMessage:self.entry.message]; 

CGRect rect = CGRectMake(MESSAGE_FRAME.origin.x + 8, y, MESSAGE_FRAME.size.width - 16, height); 

UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f]; 

[[UIColor colorWithWhite:0.2 alpha:1.0] setFill]; 

[self.entry.message drawInRect:rect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft]; 

और यहाँ कोड है अगर मैं दिखाना चाहता हूँ कोर पाठ में एक ही पाठ:

CGRect rect2 = CGRectMake(MESSAGE_FRAME.origin.x + 8, self.bounds.size.height - y - height + 2, MESSAGE_FRAME.size.width - 16, height); 


    UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f]; 
    CGFloat lineHeight = [font lineHeight]; 

    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"Crimson", 15.0f, NULL); 

    CGFloat lineSpacing = 0; 

    CTParagraphStyleSetting settings[] = { 
     { kCTParagraphStyleSpecifierMinimumLineHeight, sizeof(lineHeight), &lineHeight }, 
     { kCTParagraphStyleSpecifierMaximumLineSpacing, sizeof(lineSpacing), &lineSpacing }, 

    }; 

    CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings)/sizeof(settings[0])); 

    NSMutableDictionary *attDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            (__bridge_transfer id)fontRef, (NSString *)kCTFontAttributeName, 
              (id)[[UIColor colorWithWhite:0.2 alpha:1.0] CGColor], (NSString *)kCTForegroundColorAttributeName, 
              paragraphStyle, kCTParagraphStyleAttributeName, 
              nil]; 

    NSAttributedString *attString = [[NSAttributedString alloc] initWithString:self.entry.message attributes:attDictionary]; 

    //Flip the coordinate system 
    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 



    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddRect(path, NULL, rect2); 


    self.framesetter = CTFramesetterCreateWithAttributedString((__bridge_retained CFAttributedStringRef)attString); 
    CTFrameRef theFrame = CTFramesetterCreateFrame(self.framesetter, CFRangeMake(0, [attString length]), path, NULL); 

    CFRelease(path); 

    CTFrameDraw(theFrame, context); 
    CFRelease(theFrame); 

जाहिर है, अधिक longwinded होने के बावजूद, कोर पाठ कोर ग्राफिक्स, जो कारण मैं इसे कैसे करना सीखा है की तुलना में तेजी करने के लिए है। लेकिन इस कोड को उपकरणों में चलाकर, कोर ग्राफिक्स 5 एमएमएस प्राप्त कर रहा है, जबकि कोर टेक्स्ट इसे 14 एमएस में कर रहा है। मुझे लगता है कि मैं यहाँ कुछ याद कर रहा हूँ। drawInRect लगभग 3 गुना तेज है, और मैंने सुना है कि यह धीमा होना चाहिए। मैंने नीचे दिए गए कोड को जितना ज्यादा बताया है, उतना ही परिष्कृत किया है, लेकिन मैं एक विशेषज्ञ नहीं हूं और मैं किसी भी मदद की सराहना करता हूं।

स्पष्टीकरण के लिए, मैं एक दृश्य पर टेक्स्ट का एक ब्लॉक खींच रहा हूं। मैं बस इतना करना चाहता हूं। और सभी पाठों में एक ही उपस्थिति है।

+0

कोर टेक्स्ट की ताकत टेक्स्ट लेआउट में है, और मूल ग्राफिक्स में अंतर्निहित ड्राइंग कोड लागू किया गया है, मुझे नहीं लगता कि यह सरल टेक्स्ट ड्राइंग में तेज़ी से कैसे हो सकता है। – overboming

उत्तर

2

मैं सीटी सामान का उपयोग नहीं करता, लेकिन ऐसा लगता है कि आप प्रत्येक ड्रॉ पर invariant फ़ॉन्ट और अन्य विशेषताओं को स्थापित कर रहे हैं। टिप्पणी करने के लिए सब कुछ बाहर बाँटे प्रयास करें "समन्वय प्रणाली फ्लिप, और attString कैश।

यह एक बेहतर सिर-से-शीर्ष परीक्षण के लिए गति में सुधार करना चाहिए।

+0

समस्या यह है कि, गुण समान रहते हैं, स्ट्रिंग स्वयं हर बार बदलती है। जब मैं NSMutableAttributedString की स्ट्रिंग सेट नहीं कर सकता, तो मैं इसे कैश कैसे करूं? – Andrew

+0

मैं देखता हूं। हम्म। इनमें से कोई भी विशेषता वर्ण स्तर को संदर्भित नहीं करती है, इसलिए एक विचार म्यूटेबल विशेषता स्ट्रिंग में सभी बाइट्स को प्रतिस्थापित करना होगा, लेकिन यह ध्वनि स्केची करता है। कम से कम, आप attDictionary कैश कर सकते हैं (वैसे भी अधिकांश काम वहां है, और फिर हर बार एक नई गैर-परिवर्तनीय विशेषता स्ट्रिंग आवंटित करें। – danh

1

NSMutableAttributedString आप के माध्यम से स्ट्रिंग को बदलने करता है replaceCharactersInRange: withString: :

एक बार जब आप गुण शब्दकोश निर्धारित किया है, तो आप के माध्यम से जिम्मेदार ठहराया स्ट्रिंग के लिए आगे स्ट्रिंग अपडेट सीमित कर सकते हैं [myAttString replaceCharactersInRange: NSMakeRange (0, myAttString.text.length) withString: newString]

और गंदा आयत खींचें। साथ ही, मुझे लगता है कि CGContextSetTextMatrix का अर्थ CTFrameDraw का उपयोग करते समय कुछ भी नहीं है।

एक अन्य त्वरित नोट, मुझे CTFontRef और CTParagraphStyleRef पर कोई रिलीज दिखाई नहीं देता है। वे "नियम बनाएं" का भी पालन करते हैं और CFRelease() 'डी होना चाहिए।

मैं हाल ही में अपने स्वयं के कोर टेक्स्ट लर्निंग वक्र के माध्यम से संघर्ष कर रहा हूं और ऐसा लगता है कि कुछ आशाजनक परिणाम प्राप्त हुए हैं। मुझे उम्मीद है कि आपके स्वयं के अनुकूलन आपको समान आशा देते हैं।

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