如何让 UILabel 更好地调整大小?
How to get UILabel to resize better?
我试图在给定的最大宽度下使我的多行 UILabel
尽可能小,但是 sizeToFit()
和 sizeThatFits(_,_)
方法没有给出我想要的结果。
看看这张图片:
红色矩形代表我传入 sizeThatFits
的宽度(而高度为 Max)。显然,如您所见,此方法实际上 return 适合 的尺寸,但它并没有给我尽可能小的尺寸,这正是我想要的。
假设我指定了 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
我意识到很难定义 "smallest size possible",因为它可以 return 这个:
Here
is
some
text
that
...
甚至每行一个字母。但是考虑到 sizeThatFits
return 具有给定的宽度和高度,为什么它不是 return 我想要的结果,高度相同,但 更小的宽度。为什么不是最小的 returned?有这样的功能吗?
斯蒂,
你可以试试这哥们:)我一直在用,感觉还不错:)
CGRect rect = [yourText boundingRectWithSize:CGSizeMake(maxWidth_you_Can_afford, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]}
context:nil];
执行后的矩形将具有呈现文本所需的最小宽度和高度:)
有了框架后,您现在可以为标签设置相同的框架并设置文本:)
我在聊天气泡中使用过它:)而且效果很好:)
编码愉快:)
我做了自己的解决方案,效果很好:
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 并检查结果高度,直到高度发生变化。当宽度太低以至于需要换行时,高度会发生变化。发生这种情况时,我 return 最后一个有效宽度 仍然需要与原始宽度相同的高度。
这非常适合我的问题,使用属性文本等
当然,在使用这个的时候,一定要在调用之前做一些检查。我不知道当标签只有一个单词、一个字母或根本没有文本时使用此功能会发生什么。我只测试了我知道这个应用程序会发生的情况,它运行良好。
我试图在给定的最大宽度下使我的多行 UILabel
尽可能小,但是 sizeToFit()
和 sizeThatFits(_,_)
方法没有给出我想要的结果。
看看这张图片:
sizeThatFits
的宽度(而高度为 Max)。显然,如您所见,此方法实际上 return 适合 的尺寸,但它并没有给我尽可能小的尺寸,这正是我想要的。
假设我指定了 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
我意识到很难定义 "smallest size possible",因为它可以 return 这个:
Here
is
some
text
that
...
甚至每行一个字母。但是考虑到 sizeThatFits
return 具有给定的宽度和高度,为什么它不是 return 我想要的结果,高度相同,但 更小的宽度。为什么不是最小的 returned?有这样的功能吗?
斯蒂,
你可以试试这哥们:)我一直在用,感觉还不错:)
CGRect rect = [yourText boundingRectWithSize:CGSizeMake(maxWidth_you_Can_afford, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]}
context:nil];
执行后的矩形将具有呈现文本所需的最小宽度和高度:)
有了框架后,您现在可以为标签设置相同的框架并设置文本:)
我在聊天气泡中使用过它:)而且效果很好:)
编码愉快:)
我做了自己的解决方案,效果很好:
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 并检查结果高度,直到高度发生变化。当宽度太低以至于需要换行时,高度会发生变化。发生这种情况时,我 return 最后一个有效宽度 仍然需要与原始宽度相同的高度。
这非常适合我的问题,使用属性文本等
当然,在使用这个的时候,一定要在调用之前做一些检查。我不知道当标签只有一个单词、一个字母或根本没有文本时使用此功能会发生什么。我只测试了我知道这个应用程序会发生的情况,它运行良好。