2010-09-28 58 views
11

Tôi có một NSString dài tôi muốn hiển thị trên một vài trang.Cách chia NSString dài thành các trang

Nhưng để làm điều này, tôi cần tìm hiểu xem văn bản sẽ thực sự phù hợp như thế nào trên trang.

[NSString sizeWithFont: ...] Không đủ, nó sẽ chỉ cho tôi biết nếu văn bản phù hợp trong hình chữ nhật hay không, nếu nó không, nó sẽ âm thầm cắt ngắn chuỗi, nhưng nó sẽ không cho tôi biết nơi nó cắt ngắn!

Tôi cần biết từ đầu tiên không vừa với trang, vì vậy tôi có thể chia chuỗi và vẽ phần đó trên trang tiếp theo. (và lặp lại)

Bất kỳ ý tưởng nào để giải quyết vấn đề này? Chỉ có ý tưởng tôi có bản thân mình cho đến nay là để liên tục gọi sizeWithFont: constrainedToSize: xung quanh điểm trong chuỗi nơi tôi đoán ngắt trang sẽ được, và phân tích kết quả rect, nhưng nó cảm thấy cồng kềnh và chậm và tôi (. vì xuống của, và không có điều gì) cảm thấy tôi có thể có vấn đề bổ sung nhận nó chính xác 100% ...

OFC, nó phải có sẵn trong cộng đồng iOS SDK

trả lời:

Phew, đó là một số tài liệu lông. Đây là chức năng hoàn thành của tôi như là một ví dụ, có lẽ nó sẽ giúp một ai đó, vì không có nhiều ví dụ về văn bản cốt lõi cho iPhone.

+ (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; 
} 

LƯU Ý QUAN TRỌNG:

Bạn không thể sử dụng phạm vi trả lại hoặc kích thước với bất kỳ lớp học UIKit hoặc các chức năng chuỗi vẽ! Bạn chỉ được sử dụng nó với Core Text, ví dụ như tạo một CTFrame và vẽ nó. Sự khác biệt tinh tế về những thứ như kerning khiến không thể kết hợp các chức năng Core Text với UIKit.

Ngoài ra, lưu ý rằng kích thước trả về đã được phát hiện là lỗi.

Trả lời

3

Bạn nên xem xét CoreText, có sẵn kể từ iOS 3.2. Các tài liệu khá phức tạp và có thể được tìm thấy here. Về cơ bản bạn tạo một CTFramesetter và gọi CTFramesetterSuggestFrameSizeWithConstraints. Sau đó, bạn sẽ tìm thấy phạm vi văn bản phù hợp với một CGSize cụ thể.

+0

Cảm ơn! nó thực sự có vẻ là những gì tôi đang tìm kiếm. Tôi tìm thấy tài liệu CoreText, nhưng không thấy CTFramesetterSuggest ... Và tôi đã nhầm lẫn về mối quan hệ giữa NSString và CFAttributetStringRef. Tại thời điểm này tôi có một sollution làm việc với sizeWithFont, nhưng tôi chắc chắn sẽ xem xét thay đổi để CoreText sau –

+0

Có một số thông tin có sẵn ở đây: http://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/ TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html # // apple_ref/doc/uid/TP40009542-CH4-SW1 –

+0

hãy nhớ rằng mọi nsstring * đều giống như cfstringref (cầu nối miễn phí). –

Các vấn đề liên quan