Ios 如何根据UILabel行宽度设置UIImageView的宽度
我最近开始在Xcode中使用Swift开发一个应用程序,并试图创建一个文本气泡。为此,我需要获得多行UILabel中最长文本行的宽度。例如,如果我有此文本(我会在特定长度后自动设置换行符): 我想返回第二行文本的宽度。我已经尝试过使用sizeToFit(),这将大大简化我的工作,但由于我的其他代码,这不是一个选项,因为它会导致其他问题(我的代码如下)。是否有一种纯编程的方法可以在不使用sizeToFit()的情况下获取此值?任何帮助都将不胜感激。我的代码:Ios 如何根据UILabel行宽度设置UIImageView的宽度,ios,swift,uiimageview,uilabel,Ios,Swift,Uiimageview,Uilabel,我最近开始在Xcode中使用Swift开发一个应用程序,并试图创建一个文本气泡。为此,我需要获得多行UILabel中最长文本行的宽度。例如,如果我有此文本(我会在特定长度后自动设置换行符): 我想返回第二行文本的宽度。我已经尝试过使用sizeToFit(),这将大大简化我的工作,但由于我的其他代码,这不是一个选项,因为它会导致其他问题(我的代码如下)。是否有一种纯编程的方法可以在不使用sizeToFit()的情况下获取此值?任何帮助都将不胜感激。我的代码: bubbleContents.text
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
下面是我当前文本气泡的图像:
您可以使用
NSAttributedString,boundingRect(with:options:context:)
方法,首先创建NSAttributedString
,并使用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
用法:
bubble.frame.size.width = bubbleSize.width
bubble.frame.size.height = max(bubbleSize.height, 44.0)
如何将气泡大小应用于气泡?
bubble.frame.size.width = bubbleSize.width
bubble.frame.size.height = max(bubbleSize.height, 44.0)