如何让UILabel更好地调整大小?

时间:2016-05-12 13:05:59

标签: ios swift uiview uilabel

我尝试使用给定的最大宽度尽可能地使我的多线UILabel尽可能小,但sizeToFit()sizeThatFits(_,_)方法并未给出我想要的结果。

看看这张图片: enter image description here 红色矩形表示我在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返回此值,并给定宽度和高度,为什么它不会返回我想要的结果,即高度相同但较小的宽度。为什么退回的最小尺寸不合适?这样的函数是否存在?

2 个答案:

答案 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并检查生成的高度,直到高度发生变化。当宽度太低而需要换行时,高度会发生变化。发生这种情况时,我会返回最后一个有效宽度,它仍然需要与原始相同的高度。

这对我的问题非常适合,使用属性文本等。

当然,使用此功能时,请务必在致电前进行一些检查。我不知道如果你在标签有一个单词,一个字母或根本没有文字时使用这个功能会发生什么。我只测试了这个应用程序我知道会发生的情况,并且效果很好。