我尝试使用给定的最大宽度尽可能地使我的多线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
返回此值,并给定宽度和高度,为什么它不会返回我想要的结果,即高度相同但较小的宽度。为什么退回的最小尺寸不合适?这样的函数是否存在?
答案 0 :(得分:0)
性病,
你可以尝试这个好友:)我一直在使用它,似乎做得很好:))
CGRect rect = [yourText boundingRectWithSize:CGSizeMake(maxWidth_you_Can_afford, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]}
context:nil];
执行后的rect将具有渲染文本所需的最小宽度和高度:)
现在拥有框架后,您可以为标签设置相同的内容并设置文本:)
我在聊天泡泡中使用它:)它运行良好:)
快乐编码:)
答案 1 :(得分:0)
我制作了自己的解决方案,效果很好:
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并检查生成的高度,直到高度发生变化。当宽度太低而需要换行时,高度会发生变化。发生这种情况时,我会返回最后一个有效宽度,它仍然需要与原始相同的高度。
这对我的问题非常适合,使用属性文本等。
当然,使用此功能时,请务必在致电前进行一些检查。我不知道如果你在标签有一个单词,一个字母或根本没有文字时使用这个功能会发生什么。我只测试了这个应用程序我知道会发生的情况,并且效果很好。