我有一个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
对齐,而且看起来足够好。