Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何根据UILabel行宽度设置UIImageView的宽度_Ios_Swift_Uiimageview_Uilabel - Fatal编程技术网

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

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

我最近开始在Xcode中使用Swift开发一个应用程序,并试图创建一个文本气泡。为此,我需要获得多行UILabel中最长文本行的宽度。例如,如果我有此文本(我会在特定长度后自动设置换行符):

我想返回第二行文本的宽度。我已经尝试过使用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
下面是我当前文本气泡的图像:


您可以使用
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)