如何在多行 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 中?