0

我有一个非常长的文本,所以我不想使用 UITextView,而是将文本截断为可以适合宽度和高度为 300、400 的标签的小块,并且根据块的数量,我想动态创建 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;
}
4

1 回答 1

0

是的,您需要添加段落样式才能使宽度/高度测量正常工作。请参阅给定框架设置正确的行间距调整。请注意如何使用 CTFontGetLeading() 获取字体前导,然后通过 CFAttributedStringSetAttributes() 设置此属性。

于 2013-06-29T03:01:58.483 回答