如何在多行UILabel中找到最后一行文本的位置,或者以其他方式使UILabel具有0填充



我有一个UILabel,它的-numberOfLines设置为3,文本大小自动收缩,我需要将另一个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::它要么返回一个单行等效的rect,要么,如果我摆弄这些选项,返回一个与原始标签大小相同的rect(也就是说,包括我试图消除的额外插入)。请注意,删除任何插入的想法是,如果我无法知道最后一行文本在哪里,至少我可以删除标签中的任何插入,以便最后一行文字与标签的bounds.origin.y + bounds.size.height对齐。

有什么想法吗?

我不知道问题是最初我在非属性文本上使用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对齐,而且看起来足够好。

相关内容

最新更新