Я пытаюсь вычислить высоту UILabel на основе разных длин строк.
func calculateContentHeight() -> CGFloat{
var maxLabelSize: CGSize = CGSizeMake(frame.size.width - 48, CGFloat(9999))
var contentNSString = contentText as NSString
var expectedLabelSize = contentNSString.boundingRectWithSize(maxLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16.0)], context: nil)
print("\(expectedLabelSize)")
return expectedLabelSize.size.height
}
Выше приведена текущая функция, которую я использую для определения высоты, но она не работает. Я был бы очень признателен за любую помощь, которую я могу получить. Я предпочел бы ответ в Swift, а не Цель C.
Ответы:
Используйте расширение на
String
Swift 3
а также на
NSAttributedString
(что иногда очень полезно)Swift 4
Просто измените значение для
attributes
вextension String
методахиз
в
источник
[NSFontAttributeName: font, NSLineBreakMode: .ByWordWrapping]
но это не сработалоNSParagraphStyleAttributeName : style
где стиль NSMutableParagraphStylesizeForItemAtIndexPath
вUICollectionView
том , что он , кажется, отменить возврат кinsetForSectionAt
Для многострочного текста этот ответ не работает правильно. Вы можете создать другое расширение String с помощью UILabel
UILabel получает фиксированную ширину, а .numberOfLines устанавливается в 0. Добавляя текст и вызывая .sizeToFit (), он автоматически подстраивается под правильную высоту.
Код написан на Swift 3 🔶🐦
источник
sizeToFit
Вот простое решение, которое работает для меня ... похоже на некоторые другие опубликованные, но оно не включает в себя необходимость звонить
sizeToFit
Обратите внимание, что это написано в Swift 5
Это обрабатывает перенос строк и тому подобное. Не самый элегантный код, но он выполняет свою работу.
источник
источник
Это мой ответ в Swift 4.1 и Xcode 9.4.1
Теперь вы вызываете эту функцию
источник
Я обнаружил, что принятый ответ работает для фиксированной ширины, но не для фиксированной высоты. Для фиксированной высоты он просто увеличит ширину, чтобы уместить все на одной строке, если в тексте не было разрыва строки.
Функция width вызывает функцию height несколько раз, но это быстрый расчет, и я не заметил проблем с производительностью при использовании функции в строках UITable.
источник
minimumTextWrapWidth:CGFloat
?Проверьте высоту текста метки и она работает над этим
источник
Это решение поможет рассчитать высоту и ширину во время выполнения.
Здесь вы можете рассчитать приблизительную высоту, которую будет принимать ваша строка, и передать ее в фрейм UILabel.
источник
Свифт 5:
Если у вас есть UILabel и каким-то образом у вас не работает boundingRect (я сталкивался с этой проблемой. Он всегда возвращал высоту в 1 строку). Существует расширение, позволяющее легко рассчитать размер метки.
Вы можете использовать это так:
Работает для меня
источник
источник