计算AttributeText的宽度和高度不正确

时间:2017-04-04 09:21:09

标签: ios swift

我正在进行应用聊天,但我对聊天消息的大小有疑问。

我已经计算了我的信息高度,并且我已经正确的身高

maximumMessageWidth = 300.0
let size = CGSize(width: maximumMessageWidth, height: 1000.0)
let messageAttributeText = messageBody.attributedText
let height = messageAttributeText?.boundingRect(with: size, options: .usesLineFragmentOrigin, context: nil).height

避免像这张图片这样的特殊情况。我必须计算宽度

enter image description here 我的消息后面有很大的空间

我希望它看起来像这样:

enter image description here

这是我用来计算邮件宽度的代码(我使用了正确的高度,我计算了宽度)

let size = CGSize(width: 1000.0, height: height)
let messageAttributeText = messageBody.attributedText
var width = messageAttributeText?.boundingRect(with: size, options: .usesLineFragmentOrigin, context: nil).width

但此代码中的width似乎不对。因为我认为它确实关心我的身高属性。 假设我的文字只有一行。 但我想计算宽度,这样我的文字就会“填满整个标签”。就像第二张图片一样

有人知道如何计算我的宽度吗?

2 个答案:

答案 0 :(得分:0)

您可以通过投射String to NSString

来实现这一目标
var string = "Hello, World"
let nsString = string as NSString

let size = nsString.size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 14)])

该尺寸会为您提供字符串的widthheight

您可以将其应用于NSAttributedString字符串属性。

答案 1 :(得分:0)

经过一番研究后,我发现了这一点:

计算宽度代码无法正常工作,因为它不关心高度属性。

如果height = 100height = 1000它将返回相同的结果,因为它假定只在一行中绘制所有文本。

因此,为了计算宽度,我使用二分搜索

var minWidth:CGFloat = 0.0
var maxWidth = maxWidth
while true {
    if (minWidth >= maxWidth) {
        width = minWidth
        break
    }

    let testWidth = (maxWidth + minWidth) / 2.0
    if calculateMessageHeight(width: testWidth) > messageHeight {
        minWidth = testWidth + 2.0
        continue
    } else {
        maxWidth = testWidth - 2.0
        continue
    }