Как установить ширину UIImageView на основе ширины строки UILabel - PullRequest
1 голос
/ 13 апреля 2019

Я недавно начал работу над приложением, использующим Swift в XCode, и пытаюсь создать текстовый пузырь.Для этого мне нужно получить ширину самой длинной строки текста в многорядной 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 Ответ

1 голос
/ 14 апреля 2019

Вы можете использовать метод 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)
...