如何获取UILabel截断文本的范围

时间:2013-07-01 10:02:49

标签: iphone ios objective-c text uilabel

我正试图找出一种方法来理解UILabel实例在哪个范围内截断文本。我知道如何使用-sizeWithFont:constrainedToSize:lineBreakMode:获取字符串占用的大小。
假设我们有一个大约5行的UILabel和一个长文本,使用上面的方法,我能够知道它是否适合。如果它不适合我想添加另一个UILabel与剩余的文本。我这样做是因为视图布局与图像混合在一起,当图像完成时,我希望在视图的整个宽度上有一个文本。
我知道在核心文本中,我只能在一个视图中做到这一点,但我更愿意使用UILabel轻松实现。
/ * IMAGE * / ## / * TEXT * /
/ * IMAGE * / ## / * TEXT * /
/ * IMAGE * / ## / * TEXT * /
/ * IMAGE * / ## / * TEXT * /
/ * IMAGE * / ## / * TEXT * /
/ * ** * * TEXT * ** * ** * ** * *** /
/
** * *** TEXT * ** * ** * ** * *** / <登记/> / ** * *** TEXT * ** * ** * ** * **** /

1 个答案:

答案 0 :(得分:2)

我找到了一个解决方案答案是重复Get truncated text from UILabel
我从该答案复制修改后的方法,您需要导入CoreText框架并确保标签设置为自动换行:

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

    NSString *chunk = [[NSString alloc] init];
    NSMutableAttributedString *attrString = nil;
    UIFont *uiFont = label.font;
    CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL);
    NSDictionary *attr = [NSDictionary dictionaryWithObject:(__bridge id)ctFont forKey:(id)kCTFontAttributeName];
    attrString  = [[NSMutableAttributedString alloc] initWithString:text attributes:attr];
    CTFramesetterRef frameSetter;


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

        frameSetter = CTFramesetterCreateWithAttributedString ((__bridge CFAttributedStringRef) attrString);
        CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0,0), NULL, CGSizeMake(label.bounds.size.width, label.bounds.size.height), &fitRange);
        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;
}