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

时间:2013-12-05 18:52:23

标签: ios7 uilabel

我有一个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,或者,如果我使用选项,aa rect与原始标签的大小相同(即包括我试图摆脱的额外插图)。请注意,删除任何插入后面的想法是,如果我无法知道最后一行文本的位置,至少我可以删除标签中的任何插入内容,以便最后一行文本与标签{{1 }}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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