UILabel尾部截断

7

我正在使用Objective-C开发iOS应用程序,遇到了一个关于UILabel的问题,希望能得到一些帮助。基本上,我有一个标签,可以根据要显示的文本更改大小,但它有可能达到的最大高度。标签本身始终具有固定的宽度。我已经打开了UILineBreakModeWordWrap和UILineBreakModeTailTruncation以使文本适合并截断,但当只剩下一个单词时,这会导致文本过早地截断尾部。而不是在还有空间的情况下将其移动到下一行,它只是截断它。

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0);
self.lineBreakMode = UILineBreakModeWordWrap | UILineBreakModeTailTruncation;
self.numberOfLines = 0;
[self sizeToFit];

有没有办法找出 UILabel 实际截断文本的时间,以便我可以检查标签高度并在有余地时添加高度?我尝试在有余地时总是添加一行额外的高度,这避免了早期截断,但最终标签大小不一致。如果有任何想法,请告诉我,谢谢。
4个回答

13

lineBreakMode 是一个开关。它可以是(iOS6+) NSLineBreakByWordWrapping 或者 NSLineBreakByTruncatingTail 但不能同时使用。

然而,要回答您的问题,您可以使用NSString+UIKit类扩展来查找一些文本的大小。 在找到大小后,您可以适当地更新UILabel的框架。


最终从您提供的链接中获取了应该是的大小(sizeWithFont:),然后根据是否达到最大值将linebreakmode设置为wordwrap或tail trunc,然后使用sizetofit,效果非常好,谢谢。 - glogic
这个类别的提示很好。以前我不知道它的存在。 - chakrit

1

我遇到了类似的问题,并用一个非常简单的解决方案解决了它(在iOS 8.4,Xcode 7上测试通过)。

在IB中(我使用自动布局和一些约束):

set UIlabel numberOfLine = 1;
LineBrakeMode = TruncateTail

在代码中:

label.numberOfLines = 2; // I can only display 2 row. 
// I supposed you should know how many rows you can displayed.

label.preferredMaxLayoutWidth = label.frame.size.width;
[label sizeToFit];

大功告成。请注意,这只适用于UILabel。对于UIButton可能不起作用(未测试)。


+1 为 "preferredMaxLayoutWidth" 属性揭幕。我有另一个来自主题发起者的案例,但这个属性解决了我的问题。 - Stanislau Baranouski

0

我已经编写了一个用于处理UILabel截断的类别。适用于iOS 7及更高版本。希望能对您有所帮助!

@implementation UILabel (Truncation)

- (NSRange)truncatedRange
{
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];

    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
    [textStorage addLayoutManager:layoutManager];

    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
    textContainer.lineFragmentPadding = 0;
    [layoutManager addTextContainer:textContainer];

    NSRange truncatedrange = [layoutManager truncatedGlyphRangeInLineFragmentForGlyphAtIndex:0];
    return truncatedrange;
}

- (BOOL)isTruncated
{
    return [self truncatedRange].location != NSNotFound;
}

- (NSString *)truncatedText
{
    NSRange truncatedrange = [self truncatedRange];
    if (truncatedrange.location != NSNotFound)
    {
        return [self.text substringWithRange:truncatedrange];
    }

    return nil;
}

@end

0
使用这种方法:

如何查找UILabel的行数

您可以将标签设置为最大高度,找出标签中文本的高度,并根据需要缩小它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接