【问题标题】:How to find the position of the last text line in a multiline UILabel or otherwise have UILabel have 0 padding如何在多行 UILabel 中找到最后一个文本行的位置,或者让 UILabel 有 0 填充
【发布时间】: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 对齐.

有什么想法吗?

【问题讨论】:

    标签: ios7 uilabel


    【解决方案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 对齐,它看起来足够好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      相关资源
      最近更新 更多