uilabel 尾部截断

发布于 2024-12-29 01:25:34 字数 600 浏览 1 评论 0原文

我正在使用 Objective C 开发一个 ios 应用程序,并且我遇到了 uilabel 的问题,我需要一些帮助。基本上我有一个标签,可以更改大小以适应它将显示的文本,但它有一个可能的最大高度。标签本身始终具有固定宽度。我已打开 UILineBreakModeWordWrap 和 UILineBreakModeTailTruncation 以使文本适合并截断,但这会导致文本在只剩下 1 个单词要放置时过早截断尾部。而不是在仍有空间时将其移动到下一行,而是将其截断。

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

无论如何,是否可以找到 uilabel 何时实际截断文本,以便我可以检查标签高度并在仍有空间时添加到它?当有空间时,我总是尝试在高度上添加一条额外的线,这可以避免早期截断,但随后我会发现整个标签的尺寸不一致。任何关于这方面的想法都会非常感谢

Im working on an ios app using objective c and i have an issue with uilabel that i could use some help with. Basically i have a label that can change size to fit the text that it will display but it has a max height that it can possible be. the label itself has a fixed width at all times. i have turned on UILineBreakModeWordWrap and UILineBreakModeTailTruncation to make the text fit and truncate but this causes the text to truncate the tail too early when it has only 1 word left to place. rather then moving it onto the next line when there is still room it just truncates it.

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

is there anyway of finding when the uilabel is actually truncating the text so i can then check the label height and add to it if there is still room ? I tried always adding an extra line to the height when there is room and this avoids the early truncation but then im left with inconsistent sizing of the over all label. any ideas on this would be great thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

压抑⊿情绪 2025-01-05 01:25:34

lineBreakMode 是一个开关。它可以是(对于 iOS6+)NSLineBreakByWordWrappingNSLineBreakByTruncatingTail,但不能同时是两者。

但是,要回答您的问题,您可以使用 NSString+UIKit。找到尺寸后,您可以适当地更新 UILabel 的框架。

lineBreakMode is a switch. It can be either (for iOS6+) NSLineBreakByWordWrapping or NSLineBreakByTruncatingTail but not both.

But, to answer your question, you can find the size of some text using the class extensions in NSString+UIKit. Having found the size you could update the frame of the UILabel appropriately.

灰色世界里的红玫瑰 2025-01-05 01:25:34

我刚刚遇到类似的问题,并用一个非常简单的解决方案解决了它(在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];

Tadaa。就是这样。请注意,这仅适用于 UILabel。对于 UIButton,它可能不起作用(尚未测试)。

I just came to a similar problem, and solved it with a very simple solution (tested on ios 8.4, xcode 7).

In IB (I use autolayout with some constraints):

set UIlabel numberOfLine = 1;
LineBrakeMode = TruncateTail

In Code:

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];

Tadaa. That's it. Note that this only work with UILabel. With UIButton, it may not work (Haven't tested).

眼泪也成诗 2025-01-05 01:25:34

使用此方法:

如何查找 UILabel 的行数

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

Using this method:

How to find UILabel's number of Lines

You could set the label to the max height, find out how tall the text is in that label and shrink it as necessary.

日久见人心 2025-01-05 01:25:34

我编写了一个用于处理 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

I have written a category for working with UILabel's truncation. Works on iOS 7 and later. Hope it helps !

@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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文