Как рассчитать высоту UILabel динамически? - PullRequest
71 голосов
/ 24 августа 2011

Я хочу рассчитать количество строк и высоту UILabel динамически из заданного текста для того же.

Ответы [ 14 ]

0 голосов
/ 07 апреля 2019

Чтобы UILabel соответствовал динамическому контенту, вы можете использовать свойство lines в инспекторе свойств и установить его равным 0.

И вам не нужно делать никакого кодирования для этого.

Дляподробнее вы можете посмотреть ниже демонстрационное видео

https://www.youtube.com/watch?v=rVeDS_OGslU

0 голосов
/ 30 августа 2017

Это расширение, которое я использую для расчета многострочных высот UILabel, это скорректированный фрагмент из предыдущего сообщения о переполнении стека:

extension UILabel {
    func estimatedHeight(forWidth: CGFloat, text: String, ofSize: CGFloat) -> CGFloat {

        let size = CGSize(width: forWidth, height: CGFloat(MAXFLOAT))

        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)

        let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: ofSize)]

        let rectangleHeight = String(text).boundingRect(with: size, options: options, attributes: attributes, context: nil).height

        return ceil(rectangleHeight)
    }
}
0 голосов
/ 19 июня 2017

В моем случае я использовал фиксированный размер заголовка для каждого раздела, но с динамически размером ячейки в каждом заголовке. Высота ячейки зависит от высоты метки.

Работа с:

tableView.estimatedRowHeight = SomeNumber
tableView.rowHeight = UITableViewAutomaticDimension

Работает , но при использовании:

tableView.reloadSections(IndexSet(integer: sender.tag) , with: .automatic)

когда много заголовков не свернуто, создает много ошибок, таких как дублирование заголовка (тип заголовка x ниже того же типа) и странные анимации, когда платформа перезагружается с анимацией, даже при использовании с типом .none (FYI , фиксированная высота заголовка и высота ячейки).

Решение заключается в использовании обратного вызова heightForRowAt и вычислении высоты метки самим собой (плюс анимация выглядит намного лучше). Помните, что высота называется first .

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
    let object = dataDetailsController.getRowObject(forIndexPath: indexPath)
    let label = UILabel(frame: tableView.frame)
    let font = UIFont(name: "HelveticaNeue-Bold", size: 25)
    label.text = object?.name
    label.font = font
    label.numberOfLines = 0
    label.textAlignment = .center
    label.sizeToFit()
    let size = label.frame.height
    return Float(size) == 0 ? 34 : size
}
0 голосов
/ 12 марта 2017

если вы хотите, чтобы метка занимала динамические строки, вы можете использовать это

label.numberOfLines = 0; // allows label to have as many lines as needed
label.text = @"some long text ";
[label sizeToFit];
NSLog(@"Label's frame is: %@", NSStringFromCGRect(label.frame));
...