如何根据UILabel行宽设置UIImageView的宽度

时间:2019-04-13 20:41:37

标签: ios swift uiimageview uilabel

我最近开始在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

以下是我当前的文字提示框的图像:

Image

1 个答案:

答案 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