我正在进行应用聊天,但我对聊天消息的大小有疑问。
我已经计算了我的信息高度,并且我已经正确的身高
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
避免像这张图片这样的特殊情况。我必须计算宽度
我希望它看起来像这样:
这是我用来计算邮件宽度的代码(我使用了正确的高度,我计算了宽度)
let size = CGSize(width: 1000.0, height: height)
let messageAttributeText = messageBody.attributedText
var width = messageAttributeText?.boundingRect(with: size, options: .usesLineFragmentOrigin, context: nil).width
但此代码中的width
似乎不对。因为我认为它确实关心我的身高属性。 假设我的文字只有一行。
但我想计算宽度,这样我的文字就会“填满整个标签”。就像第二张图片一样
有人知道如何计算我的宽度吗?
答案 0 :(得分:0)
您可以通过投射String to NSString
var string = "Hello, World"
let nsString = string as NSString
let size = nsString.size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 14)])
该尺寸会为您提供字符串的width
和height
。
您可以将其应用于NSAttributedString
字符串属性。
答案 1 :(得分:0)
经过一番研究后,我发现了这一点:
计算宽度代码无法正常工作,因为它不关心高度属性。
如果height = 100
或height = 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
}