Iphone 从UILabel获取截断的文本

Iphone 从UILabel获取截断的文本,iphone,objective-c,uilabel,Iphone,Objective C,Uilabel,我是否可以为UILabel获取文本的截断版本 简言之,我有一段文字和两个UILabels——标签a,两行长,标签B,高度可变。标签A位于标签B的上方。其思想是标签A显示文本段落的前两行,在某个用户操作时,标签B可见并显示文本的其余部分 我很难确定标签B中应该包含什么,因为我不知道标签A中显示了什么。我还需要从标签A中删除“…” 注意:我意识到这有点复杂,但有一些很好的理由,我不会把问题弄得一团糟。对于标签a,针对您正在使用的特定字体,计算适合两行的近似字符 对于标签B,设置整个文本必须适合的可变

我是否可以为UILabel获取文本的截断版本

简言之,我有一段文字和两个
UILabels
——标签a,两行长,标签B,高度可变。标签A位于标签B的上方。其思想是标签A显示文本段落的前两行,在某个用户操作时,标签B可见并显示文本的其余部分

我很难确定标签B中应该包含什么,因为我不知道标签A中显示了什么。我还需要从标签A中删除“…”


注意:我意识到这有点复杂,但有一些很好的理由,我不会把问题弄得一团糟。

对于标签a,针对您正在使用的特定字体,计算适合两行的近似字符


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

我想知道您是否可以使用中的方法来计算标签A适合的程度

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

我希望其他人能想出一个更好的方法来做到这一点,但上述方法应该是可行的

更新

昨晚我看了一下我自己的应用程序的核心文本,发现了。通过查看该函数中的
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;
多亏了托马斯·穆勒 确保将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;
}

不,这不是回答问题。当您将一段较长的文本指定给超出其显示矩形的UILabel时,该文本将被截断。我想知道它被截断成什么。你的文本是什么?你想如何显示它?给我们举个例子。不幸的是,原油期权可能是唯一的选择。我希望有一个更好的解决方案,但这至少是一个解决方案。如果没有更好的答案,我会把这个问题留一段时间,而不是接受你的答案。谢谢。这对我来说非常有用(更新2),尽管我必须用kCTFontUIOptimizedTrait位重新创建CTFont,以便使宽度与-sizeWithFont:returns匹配。即使如此,在大约30个字符之后,它开始漂移超过1个像素。不知何故,UIFont和CTFont之间在连字的紧排、呈现或其他方面存在差异。太棒了!!我甚至在interface builder上进行了测试。它的字符数确实足够接近它的外观。如果文本有换行符,它将返回错误的值\n。