Отрегулируйте высоту UILabel для текста
У меня есть несколько меток, которые я хочу скорректировать их высоту в тексте, это код, который я написал для этого сейчас
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
}
EDIT:
Проблема не в этом фрагменте кода, поэтому мое исправление находится в самом вопросе. Это может быть полезно для других!
Ответы
Ответ 1
Я просто положил это на игровую площадку, и это работает для меня.
Обновлено для Swift 4.0
import UIKit
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
let font = UIFont(name: "Helvetica", size: 20.0)
var height = heightForView("This is just a load of text", font: font, width: 100.0)
Свифт 3:
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
![enter image description here]()
Ответ 2
Если вы используете AutoLayout, вы можете настроить высоту UILabel
только с помощью пользовательского интерфейса конфигурации.
Для iOS8 или выше
- Установить ограничение, ведущее/завершающее для
UILabel
- И измените строки
UILabel
от 1 до 0
![введите описание изображения здесь]()
Для iOS7
- Сначала вам нужно добавить высоту для
UILabel
- Затем измените значение От
Equal
до Greater than or Equal
![введите описание изображения здесь]()
- Наконец, измените строки
UILabel
от 1 до 0
![введите описание изображения здесь]()
Ваш UILabel
автоматически увеличит высоту в зависимости от текста
Ответ 3
Я создаю это расширение, если вы хотите
extension UILabel {
func setSizeFont (sizeFont: CGFloat) {
self.font = UIFont(name: self.font.fontName, size: sizeFont)!
self.sizeToFit()
}
}
Ответ 4
У меня есть сильное рабочее решение.
в layoutSubviews:
_title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
_title.sizeToFit()
_title.frame.size = _title.bounds.size
в текстовом устройстве:
_title.text = newValue
setNeedsLayout()
UPD.
конечно, с настройками UILabel:
_title.lineBreakMode = .ByWordWrapping
_title.numberOfLines = 0
Ответ 5
Просто установив:
label.numberOfLines = 0
Этикетка автоматически регулирует ее высоту в зависимости от количества введенного текста.
Ответ 6
на основе ответа Anorak, я также согласен с Zorayr, поэтому я добавил пару строк, чтобы удалить UILabel и вернуть только CGFloat, я не знаю, помогает ли это, поскольку исходный код не добавляет UIabel, но это не вызывает ошибки, поэтому я использую следующий код:
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
var currHeight: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()
currHeight = label.frame.height
label.removeFromSuperview()
return currHeight
}
Ответ 7
Решение, предложенное Anorak как вычисляемое свойство в расширении для UILabel:
extension UILabel
{
var optimalHeight : CGFloat
{
get
{
let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = self.lineBreakMode
label.font = self.font
label.text = self.text
label.sizeToFit()
return label.frame.height
}
}
}
Использование:
self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight
Ответ 8
Следуя ответу @Anorak, я добавил это расширение в String и отправил вставку в качестве параметра, потому что много раз вам понадобится дополнение к вашему тексту.
В любом случае, может быть, некоторые из них вы найдете это полезным.
extension String {
func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = self
label.sizeToFit()
return label.frame.height + insets.top + insets.bottom
}
}
Ответ 9
В swift 4.1 и Xcode 9.4.1
Всего 3 шага
Шаг 1)
//To calculate height for label based on text size and width
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat {
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
Шаг 2)
//Call this function
let height = heightForView(text: "This is your text", font: UIFont.systemFont(ofSize: 17), width: 300)
print(height)//Output : 41.0
Шаг 3)
//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)
Ответ 10
Вот как вычислить высоту текста в Swift. Затем вы можете получить высоту из прямоугольника и установить высоту ограничения метки или textView и т.д.
let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"
let textString = text as NSString
let textAttributes = [NSFontAttributeName: font]
let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
Ответ 11
просто вызовите этот метод, где вам нужна динамическая высота для метки
func getHeightforController(view: AnyObject) -> CGFloat {
let tempView: UILabel = view as! UILabel
var context: NSStringDrawingContext = NSStringDrawingContext()
context.minimumScaleFactor = 0.8
var width: CGFloat = tempView.frame.size.width
width = ((UIScreen.mainScreen().bounds.width)/320)*width
let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize
return size.height
}
Ответ 12
Swift 4.0
self.messageLabel = UILabel (рамка: CGRect (x: 70, y: 60, ширина: UIScreen.main.bounds.width - 80, высота: 30)
messageLabel.text = message
messageLabel.lineBreakMode = .byWordWrapping //in versions below swift 3 (messageLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping)
messageLabel.numberOfLines = 0 //To write any number of lines within a label scope
messageLabel.textAlignment = .center
messageLabel.textColor = UIColor.white
messageLabel.font = messageLabel.font.withSize(12)
messageLabel.sizeToFit()
Blockquote NSParagraphStyle.LineBreakMode применяется к целым абзацам, а не к словам в параграфах. Это свойство действует как во время обычного рисования, так и в случаях, когда размер шрифта должен быть уменьшен, чтобы соответствовать тексту меток в его ограничивающей рамке. По умолчанию это свойство имеет значение TruncatingTail.
Эта ссылка описывает способ раскадровки того же самого
Ответ 13
Swift 4.0
Вместо вычисления высоты текста/метки я просто изменяю размер метки после вставки (динамического) текста.
Предполагая, что myLabel является рассматриваемой UILabel:
let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...
И теперь идет интересная часть:
var myLabelText: String = "" {
didSet {
myLabel.text = myLabelText
myLabel.sizeToFit()
}
}
Ответ 14
Метод расширения Swift 4.1 для расчета высоты этикетки:
extension UILabel {
func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
}
Ответ 15
Чтобы сделать метку динамичной в быстром, не задавайте высоту, а в раскадровке укажите количество строк в метке 0, а также задайте нижнее ограничение, и это лучший способ обработки динамической метки в соответствии с размером их содержимого.