如何让 UILabel 更好地调整大小?
Posted
技术标签:
【中文标题】如何让 UILabel 更好地调整大小?【英文标题】:How to get UILabel to resize better? 【发布时间】:2016-05-12 13:05:58 【问题描述】:我正在尝试使用给定的最大宽度使我的多行 UILabel
尽可能小,但是 sizeToFit()
和 sizeThatFits(_,_)
方法没有给出我想要的结果。
看看这张图片:
红色矩形代表我传入sizeThatFits
的宽度(而高度为Max)。显然,如您所见,此方法实际上确实返回适合的尺寸,但它并没有给我我想要的最小尺寸。
假设我指定了max-width: 300
。这个实际结果给了我大约 ca 的大小。 280*50
。
正如您在图像中看到的,文本现在是这样写的:
Here is some text that is supposed to
align nicely
我想要实现的是:
Here is some text that is
supposed to align nicely
这个结果将具有相同的高度,但宽度要小得多,例如 200*50
我意识到很难定义“可能的最小尺寸”,因为它可能会返回:
Here
is
some
text
that
...
甚至每行只有一个字母。但是考虑到sizeThatFits
以给定的宽度和高度返回它,为什么它不返回我想要的结果,它是相同的高度,但具有更小的宽度。为什么不返回最小的拟合?有这样的功能吗?
【问题讨论】:
你试过 label.minimumScaleFactor = 0.7 还是 0.8 ? 我认为你需要将 textAlignment 设置为 center @RahulVyasMinimumScaleFactor
与此无关。不,我不希望文本居中对齐。即使我使用textAlignment=.Center
,它也会在同一个地方打断句子,使文本align nicely
单独出现在下一行。
我不认为你可以在原始实现中找到它,你可能必须通过在计算要显示的行数后限制一行中的字符数来自己实现它
【参考方案1】:
斯蒂,
你可以试试这个哥们:)我一直在使用它,似乎做得很好:)
CGRect rect = [yourText boundingRectWithSize:CGSizeMake(maxWidth_you_Can_afford, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@NSFontAttributeName:[UIFont systemFontOfSize:16]
context:nil];
执行后的矩形将具有呈现文本所需的最小宽度和高度:)
一旦你现在有了框架,你就可以为你的标签设置相同的内容并设置文本:)
我在聊天气泡中使用过它:) 效果很好:)
编码愉快:)
【讨论】:
这对我不起作用..给了我一个稍微不同的结果,但仍然是相同的结果。一个像素的几分之一不同..奇怪。你确定你没有做其他事情吗? 嗯,没有别的了,伙计:|我将它与具有宽度限制的标签一起使用,并根据矩形值更新我的聊天气泡宽度,它工作得非常好。您是否将标签的字体大小设置为 16 并将样式设置为系统字体?此方法高度依赖 UIFont,如果您提供的标签字体不同,计算文本中的不同字体将无法正确包装 @sti :出于好奇,问你为什么需要最小空间?通常 UILabels 使用密集的大小,它不会获得不必要的额外空间。我这样做是因为我可以让我的聊天气泡从一侧开始并在另一侧结束,所以我将最大宽度指定为屏幕宽度的 70% 我可以知道你到底想做什么???跨度> 我需要它尽可能小,给定最大宽度,例如300px
。这意味着200px*50px
比280px*50px
更好,因为它更小。这是设计师设计的,所以这是我要开发的。如果标签使用多于一行,我希望它分布单词,以便它使用尽可能少的空间和宽度。当我们可以缩小宽度并在两行上具有相同的宽度时,为什么在下一行 alone 上只有一个单词?这就是我想要达到的目标。如问题所示。
是的,我确实将字体设置为与标签相同的字体。这一切都是以编程方式制作的(不是故事板或任何东西)。【参考方案2】:
我自己做了一个解决方案,效果很好:
private func calculateWantedSize(label:UILabel)->CGSize
var lastAcceptableWidth = label.bounds.width
let currentHeight = label.sizeThatFits(CGSize(width: label.bounds.width, height: CGFloat.max)).height
var tempHeight = currentHeight
while(tempHeight == currentHeight)
let newWidth = lastAcceptableWidth - 1
tempHeight = label.sizeThatFits(CGSize(width: newWidth, height: CGFloat.max)).height
if tempHeight == currentHeight
lastAcceptableWidth = newWidth
return CGSize(width: lastAcceptableWidth, height: label.bounds.height)
在这里,我将我的标签发送到一个函数,该函数首先计算标签的当前宽度和高度,然后循环通过 width-1 并检查结果高度,直到高度改变。当宽度太低以至于需要换行时,高度会发生变化。发生这种情况时,我返回 最后一个有效宽度,它仍然需要与原始高度相同。
这非常适合我的问题,使用属性文本等。
当然,在使用这个的时候,一定要在调用前做一些检查。我不知道如果你在标签只有一个单词,或者一个字母,或者根本没有文字的情况下使用这个功能会发生什么。我仅针对我知道此应用会发生的情况对此进行了测试,并且效果很好。
【讨论】:
以上是关于如何让 UILabel 更好地调整大小?的主要内容,如果未能解决你的问题,请参考以下文章
调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?
调整 UILabel 的大小以适应自定义 UITableViewCell 中的文本,无论宽度如何