我最近开始在Xcode中使用Swift来开发应用程序,并且正在尝试创建文本气泡。为此,我需要获取多行UILabel中最长的文本行的宽度。例如,如果我有此文本(我会在一定长度后自动设置换行符):
Hello there, this is
an example piece of text
我想返回第二行中文本的宽度。我已经尝试过使用sizeToFit()来大大简化我的工作,但是由于我的其他代码,这不是一个选择,因为它会导致其他问题(下面的代码)。是否有一种纯粹的编程方式可以在不使用sizeToFit()的情况下获取此值?任何帮助将非常感激。我的代码:
bubbleContents.text = textMessage
bubbleContents.numberOfLines = 0
bubbleContents.lineBreakMode = .byWordWrapping
bubbleContents.bounds.size.width = 2000
var widthText = bubbleContents.intrinsicContentSize.width
bubbleContents.bounds.size.width = 266
print(textMessage)
print(widthText)
if widthText > 266 {
let numRows = Int(widthText/266)
print(numRows)
//bubbleContents.frame.origin.y += CGFloat((Double(numRows)*10.25))
var currentHeight = 44.0
currentHeight += Double((Double(numRows)*20.5))
bubbleContents.bounds.size.height = CGFloat(currentHeight)
heightOfCell = Double(currentHeight)
let originalTransform = self.bubbleContents.transform
let scaledTransform = originalTransform
let scaledAndTranslatedTransform = scaledTransform.translatedBy(x: 0, y: CGFloat(Double(numRows)*20.5))
//self.bubbleContents.transform = scaledAndTranslatedTransform
}
else {
heightOfCell = 44.0
}
bubble.frame = CGRect(x: 0, y: 0, width: Double(widthText + 30), height: heightOfCell - 4)
bubbleContents.center.y = bubble.center.y
以下是我当前的文字提示框的图像:
答案 0 :(得分:1)
您可以使用NSAttributedString,boundingRect(with:options:context:)
方法,首先创建具有属性NSAttributedString
的{{1}}
UILabel
现在使用let attributes: [NSAttributedString.Key : Any] = [.font: bubbleContents.font]
let atStr = NSAttributedString(string: textMessage, attributes: attributes)
方法,如下所示:
atStr.boundingRect(with:options:context:)
用法:
let bounds = CGSize(width: 266.0, height: .greatestFiniteMagnitude)
let bubbleSize = atStr.boundingRect(with: bounds, options: [.usesLineFragmentOrigin, .usesFontLeading, .usesDeviceMetrics], context: nil).size