2010-09-28 11 views
11

मेरे पास एक लंबा एनएसएसटींग है जो मैं कुछ पृष्ठों पर प्रदर्शित करना चाहता हूं।पृष्ठों में लंबे एनएसएसटींग को कैसे विभाजित करें

लेकिन ऐसा करने के लिए, मुझे यह पता लगाना होगा कि पृष्ठ पर वास्तव में कितना टेक्स्ट फिट होगा।

[एनएसएसटींग आकारविथफॉन्ट: ...] पर्याप्त नहीं है, यह सिर्फ मुझे बताएगा कि पाठ आयताकार में फिट बैठता है या नहीं, अगर ऐसा नहीं होता है, तो यह चुपचाप स्ट्रिंग को छोटा कर देगा, लेकिन यह मुझे नहीं बताएगा जहां यह छोटा हो गया!

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

कोई विचार यह कैसे हल करें?

केवल विचार है कि मेरे पास अभी तक आकार है जिसे आकार के साथ बार-बार कॉल करना है: बाध्यकारी: स्ट्रिंग में बिंदु के आस-पास जहां मैं पृष्ठ ब्रेक का अनुमान लगा रहा हूं, और परिणामस्वरूप आयत का विश्लेषण करेगा, लेकिन यह बोझिल और धीमा लगता है और मैं (। क्योंकि descenders की, और whatnot):

मैं अतिरिक्त समस्याओं यह 100% सही हो रही है ... हो सकता है महसूस

ओएफसी, यह सार्वजनिक iOS SDK का

उत्तर में उपलब्ध हो गया है

पुhew, वह कुछ बालों वाले दस्तावेज थे। यहां मेरा पूरा कार्य एक उदाहरण के रूप में है, शायद यह किसी की मदद करेगा, क्योंकि वहाँ बहुत से आईफोन-विशिष्ट कोर टेक्स्ट उदाहरण नहीं हैं।

+ (NSArray*) findPageSplits:(NSString*)string size:(CGSize)size font:(UIFont*)font; 
{ 
    NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:32]; 
    CTFontRef fnt = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize,NULL); 
    CFAttributedStringRef str = CFAttributedStringCreate(kCFAllocatorDefault, 
                 (CFStringRef)string, 
                 (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:(id)fnt,kCTFontAttributeName,nil]); 
    CTFramesetterRef fs = CTFramesetterCreateWithAttributedString(str); 
    CFRange r = {0,0}; 
    CFRange res = {0,0}; 
    NSInteger str_len = [string length]; 
    do { 
    CTFramesetterSuggestFrameSizeWithConstraints(fs,r, NULL, size, &res); 
    r.location += res.length; 
    [result addObject:[NSNumber numberWithInt:res.length]]; 
    } while(r.location < str_len); 
// NSLog(@"%@",result); 
    CFRelease(fs); 
    CFRelease(str); 
    CFRelease(fnt); 
    return result; 
} 

महत्वपूर्ण नोट:

आप लौटे रेंज या किसी UIKit वर्ग या स्ट्रिंग ड्राइंग कार्यों के साथ आकार का उपयोग नहीं कर सकता! आपको केवल कोर टेक्स्ट के साथ इसका उपयोग करना होगा, उदाहरण के लिए सीटीफ़्रेम बनाना और उसे चित्रित करना। कर्नाई जैसी चीजों में सूक्ष्म अंतर UIKit के साथ कोर टेक्स्ट फ़ंक्शंस को जोड़ना असंभव बनाता है।

इसके अलावा, ध्यान दें कि लौटा आकार खराब हो गया है।

उत्तर

3

आपको कोरटेक्स्ट में देखना चाहिए, जो आईओएस 3.2 के बाद उपलब्ध है। दस्तावेज़ अपेक्षाकृत जटिल हैं और here मिल सकते हैं। असल में आप एक CTFramesetter बनाते हैं और CTFramesetterSuggestFrameSizeWithConstraints को कॉल करते हैं। तब आपको उस पाठ की श्रेणी मिल जाएगी जो किसी दिए गए CGSize के भीतर फिट बैठती है।

+0

धन्यवाद! यह वास्तव में ऐसा लगता है जो मैं खोज रहा था। मुझे CoreText दस्तावेज़ मिले, लेकिन CTFramesetterSuggest नहीं देखा ... और मैं NSString और CFAttributetStringRef के बीच संबंधों पर उलझन में आया। फिलहाल मेरे पास आकार WithFont के साथ एक काम करने वाला सॉल्शन है, लेकिन मैं निश्चित रूप से कोरटेक्स्ट में बदलकर –

+0

में कुछ और जानकारी यहां उपलब्ध हूं: http://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/ TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html # // apple_ref/doc/uid/TP40009542-CH4-SW1 –

+0

ध्यान रखें कि प्रत्येक nsstring * cfstringref (टोल फ्री ब्रिज) के समान है। –

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