Автоматическая регулировка высоты для статического UITableViewCell не работает - PullRequest
0 голосов
/ 16 октября 2019

У меня есть статический UITableView, и я хочу динамически установить высоту строки для трех ячеек. Поэтому в viewDidLoad() я реализовал следующий код:

tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableView.automaticDimension

Я также реализовал метод heightForRowAt: (первые две ячейки первого раздела должны иметь фиксированную высоту)

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.section == 0 && indexPath.row == 0 {
        return CGFloat(85)
    } else if indexPath.section == 0 && indexPath.row == 1 {
        return CGFloat(145)
    }

    return UITableView.automaticDimension 
}

Вот результат, который я сейчас получаю:

enter image description here

Я также изменил строки меток на 0 и ограниченияметки внутри ячеек: 0, 12, 0, 12 (сверху, справа, снизу, слева).

Кто-нибудь знает, почему ячейка в разделе 3 неправильно отображает данные?

Редактировать: (Как это выглядит после реализации предложенного выше)

enter image description here

Ответы [ 3 ]

0 голосов
/ 16 октября 2019

Поскольку sizeToFit() не сработало для вас, мы попробуем что-то более сложное.

Ячейка в разделе 3 - , отображающая данные в правильном направлении. Это связано с тем, что UILabel s автоматически не регулируют свою высоту, чтобы разместить текст внутри. Вот что вам нужно сделать:

1. Создайте ограничение высоты для вашей UILabel В конструкторе интерфейса добавьте ограничение для высоты UILabel в ячейке раздела 3. Соедините это ограничение по высоте с классом вашего контроллера представления через @IBOutlet:

class YourViewController: UIViewController {

    @IBOutlet var cellLabel: UILabel!
    @IBOutlet var cellLabelHeight: NSLayoutConstraint!

    ...

}

2. Добавьте расширение String, которое вычисляет высоту Я не уверен, где / когда вы устанавливаете текст рассматриваемого UILabel, но я знаю, что вы делаете это где-то, поскольку вы описали его как «динамический». Всякий раз, когда вы устанавливаете текст рассматриваемого UILabel, теперь вам также необходимо изменить константу ограничения высоты, которую мы установили, чтобы вместить этот текст. Итак, мы должны иметь возможность вычислить высоту UILabel на основе его ширины и шрифта. Мы можем добавить extension к String, чтобы сделать это:

extension String {
    func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)

        return ceil(boundingBox.height)
    }
}

3. Установите константу ограничения высоты на основе текста UILabel Последний шаг - установить высоту ограничения высоты UILabel, которое мы создали, используя только что созданное нами расширение:

cellLabel.text = "DummyDataDummyDataDummyDataDummyDataDummyDataDummyDataDummyDataDummyData"
//This will be called immediately after you set the text for the UILabel in question
cellLabelHeight.constant = cellLabel.text.height(withConstrainedWidth: cellLabel.frame.width, font: cellLabel.font)
0 голосов
/ 16 октября 2019

Пожалуйста, посмотрите ниже;

  • Выберите свой cellLabel и установите значение Lines равным 0:

Также яблоко говорит: Самозабора

Сводка: раскладывает содержимое ячейки табличного представления в представлении содержимого ячейки. Чтобы определить высоту ячейки, вам нужна непрерывная цепочка ограничений и представлений (с определенной высотой), чтобы заполнить область между верхним краем представления содержимого и его нижним краем. Если ваши представления имеют внутреннюю высоту содержимого, система использует эти значения. Если нет, вы должны добавить соответствующие ограничения по высоте либо к представлениям, либо к представлению содержимого. Измените нижнее ограничение AuthorLabel с равным Больше или равно

0 голосов
/ 16 октября 2019

Ячейка в разделе 3 - , отображающая данные в правильном направлении. Если вы не укажете обратное, UILabel не будет автоматически корректироваться для размещения текста внутри него.

Что вам нужно сделать, это выбрать рассматриваемый UILabel, а затем в инспекторе атрибутов установитьNumber of Lines до 0. enter image description here

Вы также сказали, что это UILabel является динамическим, то есть вы устанавливаете его текст где-то в своем коде. Сразу после того, как вы установите текст UILabel, вы захотите позвонить myLabel.sizeToFit(). Это должно отрегулировать высоту метки, чтобы вместить текст внутри.

Если это не сработает, у меня есть другое, более сложное решение, которое должно работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...