У меня есть несколько меток, высоту которых я хочу отрегулировать в соответствии с текстом, это код, который я написал для этого сейчас
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
РЕДАКТИРОВАТЬ:
Проблема заключалась не в этом фрагменте кода, поэтому мое исправление заключается в самом вопросе. Это может быть полезно другим!
sizeWithFont
может быть недоступен для Swift,String
но он доступен на.NSString
Вы все равно должны иметь возможность вызывать его в этом случае.Ответы:
Я только что поставил это на детской площадке, и у меня это работает.
Обновлено для Swift 4.0
Swift 3:
источник
UILabel
по размеру; если этот метод используется внутри иlayoutSubviews
имеет тенденцию к многократному вызову для каждого макета, создание дополнительного объекта может вызвать заметные задержки, особенно во время прокрутки.Если вы используете AutoLayout , вы можете настроить
UILabel
высоту только с помощью пользовательского интерфейса конфигурации.Для iOS8 или выше
UILabel
UILabel
с 1 на 0Для iOS7
UILabel
Equal
наGreater than or Equal
UILabel
с 1 на 0Ваша
UILabel
высота будет автоматически увеличиваться в зависимости от текстаисточник
Я создаю это расширение, если хотите
источник
У меня есть сильное рабочее решение.
в layoutSubviews:
в установщике текста:
UPD. конечно с этими настройками UILabel:
источник
Просто установив:
Ярлык автоматически регулирует свою высоту в зависимости от количества введенного текста.
источник
на основе ответа Anorak, я также согласен с озабоченностью Зорайра, поэтому я добавил пару строк, чтобы удалить UILabel и вернуть только CGFloat, я не знаю, помогает ли это, поскольку исходный код не добавляет UIabel, но он не вызывает ошибки, поэтому я использую приведенный ниже код:
источник
В Swift 4.1 и Xcode 9.4.1
Всего 3 шага
Шаг 1)
Шаг 2)
Шаг 3)
источник
Решение, предложенное Anorak в качестве вычисляемого свойства в расширении для UILabel:
Использование:
источник
Следуя ответу @Anorak, я добавил это расширение в String и отправил вставку в качестве параметра, потому что во многих случаях вам понадобится дополнение к вашему тексту. В любом случае, может, кому-то это пригодится.
источник
Вот как рассчитать высоту текста в Swift. Затем вы можете получить высоту из прямоугольника и установить высоту ограничения для метки или textView и т. Д.
источник
просто вызовите этот метод там, где вам нужна динамическая высота для метки
источник
Swift 4.0
self.messageLabel = UILabel (кадр: CGRect (x: 70, y: 60, ширина: UIScreen.main.bounds.width - 80, высота: 30)
Эта ссылка описывает способ раскадровки сделать то же самое
источник
Swift 4.0
Вместо того, чтобы рассчитывать высоту текста / метки, я просто меняю размер метки после вставки (динамического) текста.
Предполагая, что myLabel является рассматриваемым UILabel:
А теперь самое интересное:
источник
Метод расширения Swift 4.1 для расчета высоты метки:
источник
Swift 5, XCode 11 способ раскадровки. Думаю, это работает для iOS 9 и выше. Например, вы хотите, чтобы метка «Описание» получала динамическую высоту, выполните следующие действия:
1) Выберите метку описания -> Перейти к инспектору атрибутов (значок карандаша), установите: Строки: 0 Разрыв строки: Перенос слов
2) Выберите свой UILabel в раскадровке и перейдите в Инспектор размеров (значок линейки). 3) Перейдите к «Приоритет сопротивления сжатию содержимого до 1 для всех других компонентов UIView (ярлыки, кнопки, просмотр изображений и т. Д.), Которые взаимодействуют с вашим ярлыком.
Например, в моем представлении вертикально расположены UIImageView, Title Label и Description Label. Я установил приоритет сопротивления сжатию содержимого равным UIImageView, а метку заголовка - 1, а метке описания - 750. Это приведет к тому, что метка описания будет занимать столько, сколько необходимо.
источник
Чтобы сделать метку динамической в быстром темпе, не задавайте ограничение по высоте, а в раскадровке сделайте метку, количество строк 0 также дает нижнее ограничение, и это лучший способ обработки динамической метки в соответствии с размером их содержимого.
источник
Вы также можете использовать
sizeThatFits
функцию.Например:
label.sizeThatFits(superView.frame.size).height
источник