如何在多行 UILabel 中找到最后一个文本行的位置,或者让 UILabel 有 0 填充

Posted

技术标签:

【中文标题】如何在多行 UILabel 中找到最后一个文本行的位置,或者让 UILabel 有 0 填充【英文标题】:How to find the position of the last text line in a multiline UILabel or otherwise have UILabel have 0 padding 【发布时间】:2013-12-05 18:52:22 【问题描述】:

我有一个同时将-numberOfLines 设置为 3 和文本大小自动缩小的 UILabel,我需要将另一个 UIView 与此 UILabel 的最后一行文本对齐。也就是说,我可能需要对齐第 0、1 或 2 行的 y 位置,具体取决于标签内的文本(这些文本行之间的距离可能会有所不同,具体取决于文本是否足够长以触发字体调整大小)。

但是:

UILabel 不公开contentSize 标签的边界超出了文本的最后一行(似乎有内容插入),因此无法与边界对齐。

继承 UILabel 并执行以下操作:

- (void)drawTextInRect:(CGRect)rect 
  UIEdgeInsets insets = 0., 0., -30., 0.;
  return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];

恰好适用于我有 3 行并且字体大小自动缩小的情况,但无论文本大小如何,我仍然无法找出一般情况下减去插图的通用方法。而且我似乎也无法使用-boundingRectWithSize:options:context::它要么返回一个等效的单行矩形,要么,如果我使用选项,一个与原始标签大小相同的矩形(也就是说,包括额外的我试图摆脱的插图)。请注意,删除任何插入背后的想法是,如果我无法知道最后一行文本在哪里,至少我可以删除标签中的任何插入,以便最后一行文本与标签的 bounds.origin.y + bounds.size.height 对齐.

有什么想法吗?

【问题讨论】:

【参考方案1】:

我不知道问题是我最初在非归属文本上使用boundingRectWithSize 还是什么,但现在这似乎有效:

NSString *text = <get text from CoreData>;

        NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@NSFontAttributeName: self.titleLabel.font];
        CGRect rect = [attributedText boundingRectWithSize:self.titleLabel.frame.size
                                                   options:NSStringDrawingUsesLineFragmentOrigin
                                                   context:nil];

        if (!rect.size.height || rect.size.height > self.titleLabel.frame.size.height) 
            attributedText = [[NSAttributedString alloc] initWithString:text attributes:@NSFontAttributeName: [UIFont boldSystemFontOfSize:self.titleLabel.font.pointSize * self.titleLabel.minimumScaleFactor]];
            rect = [attributedText boundingRectWithSize:self.titleLabel.frame.size
                                                options:NSStringDrawingUsesLineFragmentOrigin
                                                context:nil];
        

        self.titleLabel.frame = rect;
        self.titleLabel.attributedText = attributedText;

虽然这并没有真正找到 UILabel 中最后一行文本底部的位置(标签仍然在底部添加一些填充...不确定是否考虑下降),但它会调整标签的边界足够接近底部,我至少可以根据bounds.origin.y + bounds.size.height 对齐,它看起来足够好。

【讨论】:

以上是关于如何在多行 UILabel 中找到最后一个文本行的位置,或者让 UILabel 有 0 填充的主要内容,如果未能解决你的问题,请参考以下文章

如何计算字体大小以适应单文本行和多行弹性项目上的文本?

在线多行文本行转列工具

在 Tableview 中,我想知道如何在单元格最后位置设置多行 UILabel

如何在代码中将我的 UILableView 居中在父 RoundedRectView 中?

如何使用 bs4 或 lxml 在 Python 中找到 XML 标记的文本行?

具有多个文本行的 JavaFX 按钮