从UILabel获取截断的文本

时间:2011-07-18 02:53:11

标签: iphone objective-c uilabel

无论如何我可以获得UILabel文本的截断版本吗?

简而言之,我有一段文字,两个UILabels - 标签A,长2行,标签B,可变高度。标签A在标签B上方。想法是标签A显示文本段落的前两行,并且在某个用户操作时,标记B因为可见并显示文本的其余部分。

我无法确定标签B中的内容,因为我不知道标签A中显示的是什么。我还需要从标签A中删除“...”。

注意:我意识到这有点令人费解但是有一些很好的理由,我不会把这个问题弄得一团糟。

3 个答案:

答案 0 :(得分:11)

我想知道你是否可以使用NSString UIKit Additions中的方法来确定标签A的适合程度。

粗略的方法可能是从文本的第一个字符开始并测试它会占用的大小(-sizeWithFont:forWidth:lineBreakMode:可能?)然后继续添加一个字符,直到它不适合进入你的标签A。

我希望其他人可以提出更好的方法来做到这一点,但上述情况应该有效。

<强>更新

昨晚我看了一下我自己的应用程序的Core Text并遇到了CTFramesetterSuggestFrameSizeWithConstraints。您可以通过查看该函数中的fitRange来判断您的字符串中有多少符合标签。

更新2:

我认为这应该可行,但我刚刚在这里输入了这个,所以它甚至可能无法编译:

UIFont *uiFont = [UIFont systemFontOfZise:13.0f]; // whichever font you're using
CTFontRef ctFont = CTFontCreateWithName((CFStringRef)uiFont.fontName, uiFont.pointSize, NULL);
NSDictionary *attr = [NSDictionary dictionaryWithObject:(id)ctFont forKey:(id)kCTFontAttributeName];
CFRelease(ctfont);
NSAttributedString *attrString  = [[NSAttributedString alloc] initWithString:yourLabelText attributes:attr];
CTFrameSetterRef frameSetter = CTFrameSetterCreateWithAttributedString((CFAttributedStringRef)attrString);
[attrString release];
CFRange fitRange;
CTFrameSetterSuggestFrameSizeWithConstrains(
    frameSetter,
    CFRangeMake(0, 0),
    NULL,
    CGSizeMake(labelWidth, labelHeight),
    &fitRange);
CFRelease(frameSetter);
CFIndex numberOfCharactersThatFit = fitRange.length;

答案 1 :(得分:3)

感谢ThomasMüller 一定要将myLabel的换行模式设置为:

myLabel.lineBreakMode = NSLineBreakByWordWrapping;

通过这种方法,您可以获得实际符合约束大小的分块字符串。 这是烘焙代码:

- (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);
            CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0,0), NULL, CGSizeMake(myLabel.frame.size.width, myLabel.frame.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;
}

答案 2 :(得分:-5)

对于标签A,对于您正在使用的特定字体,计算应完全适合两行的近似字符。

对于标签B,设置整个文本必须适合的变量高度。