2013-02-01 89 views
0

我有一個非常非常長的文本,所以不是使用UITextView,而是將文本截斷爲可以適合寬度和高度爲300的標籤的小塊,400,並基於塊的數量,我想動態地創建UILabel並用這些塊填充它們。如何獲得適合約束尺寸的字符串,如UILabel

我已經寫了一個方法,但它似乎沒有返回可以適合的實際字符串。它返回更短的字符串。

我錯過了什麼? 有反正我可以做到這一點嗎?

- (NSArray *)truncate:(NSString *)text 
{ 
    NSMutableArray *textChunks = [[NSMutableArray alloc] init]; 

    NSString *chunk = [[NSString alloc] init]; 

    CTFramesetterRef frameSetter; 
    UIFont *uiFont = [UIFont systemFontOfSize:17.0f]; 
    CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL); 
    NSDictionary *attr = [NSDictionary dictionaryWithObject:(__bridge id)ctFont forKey:(id)kCTFontAttributeName]; 
    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:text attributes:attr]; 

    CFRange fitRange; 
    while (attrString.length>0) { 

     frameSetter = CTFramesetterCreateWithAttributedString ((__bridge CFAttributedStringRef) attrString); 
      CGSize framSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0,0), NULL, CGSizeMake(myLabel.frame.size.width, myLabel.frame.size.height), &fitRange); 
     NSLog(@"height: %f", framSize.height); 
     CFRelease(frameSetter); 

     chunk = [[attrString attributedSubstringFromRange:NSMakeRange(0, fitRange.length)] string]; 

     [textChunks addObject:chunk]; 

     [attrString setAttributedString: [attrString attributedSubstringFromRange:NSMakeRange(fitRange.length, attrString.string.length-fitRange.length)]]; 

    } 


    return textChunks; 
} 

回答

0

是的,你需要爲了得到寬度/高度測量正常工作添加一個段落樣式。請參閱giving-framesetter-the-correct-line-spacing-adjustment。請注意如何使用CTFontGetLeading()獲取字體前導,然後將此屬性設置爲CFAttributedStringSetAttributes()。