iOS Auto-Layout: динамическая высота для ячейки табличного представления

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

В tableView:cellForRowAtIndexPath: я добавляю предопределенный UIView (который имеет несколько подпредставлений) в представление содержимого пользовательской ячейки. Я установил все ограничения для UIView и его подвидов раньше.

И последнее, но не менее важное: я установил вертикальные и горизонтальные ограничения для представления содержимого моей пользовательской ячейки (суперпредставление) и UIView, который был добавлен ранее (подпредставление).

Строки ограничений выглядят следующим образом:

    H:|[view]|
    V:|[view]|

К сожалению, я все еще получаю высоту по умолчанию для всех ячеек представления таблицы. Мне интересно, есть ли способ, чтобы автоматическая компоновка автоматически вычисляла высоту в соответствии с размером содержимого.


person Chrizzor    schedule 21.05.2013    source источник
comment
Нет. Вам нужно реализовать tableView:heightForRowAtIndexPath и вернуть высоту, иначе будет использоваться высота ячейки по умолчанию.   -  person Robotic Cat    schedule 21.05.2013
comment
Есть ли способ позволить представлению решить, какую высоту он должен получить?   -  person Chrizzor    schedule 21.05.2013
comment
Если вы используете пользовательский UITableViewCells, вы можете создать метод в подклассе, который возвращает высоту для этой ячейки, а затем вызвать этот метод в tableView:heightForRowAtIndexPath. Очевидно, постарайтесь сделать расчет быстрым и эффективным (возможно, предварительно вычислить результат при любом изменении и кэшировать результат, если расчет очень сложный).   -  person Robotic Cat    schedule 21.05.2013
comment
спасибо за Ваш ответ. к сожалению, вычисление содержимого ячеек не является решением для меня. проблема в том, что я не знаю, что внутри представления.   -  person Chrizzor    schedule 21.05.2013
comment
Я не знаю ваше приложение, но в какой-то момент вы должны загрузить контент в его представление. Возможно, если вы зададите новый вопрос, в котором подробно описывается, как работает представление, тогда кто-то может найти метод вычисления высоты содержимого (у текста, очевидно, есть высота, как и у графики — я не могу представить, что вы загружаете, у которого нет известная или вычисляемая высота).   -  person Robotic Cat    schedule 21.05.2013
comment
Но это большое преимущество автоматической компоновки. Даже представление прокрутки и его содержимое можно компоновать автоматически, не зная, какого размера какое-либо подпредставление. Конечно, я мог бы рассчитать и суммировать высоты своих подпредставлений, но это, кажется, альтернатива всему автоматическому макету, и смешивание обоих подходов немного грязно.   -  person Chrizzor    schedule 21.05.2013
comment
Возможно, в будущей версии iOS они обновят способ работы ячеек таблицы, но (начиная с iOS 6) вам нужно смешивать оба подхода. Удачи с приложением.   -  person Robotic Cat    schedule 22.05.2013
comment
возможный дубликат Динамическая высота ячейки таблицы с Autolayout iOS 6 +   -  person jszumski    schedule 10.07.2013


Ответы (4)


Ознакомьтесь с моим подробным ответом на этот вопрос здесь: https://stackoverflow.com/a/18746930/796419

Для настройки требуется немного работы, но вы можете абсолютно точно иметь ограничения Auto Layout, управляющие полностью динамическим представлением таблицы без единой жестко запрограммированной высоты (и пусть решатель ограничений сделает тяжелую работу и предоставит вам высоту строки).

person smileyborg    schedule 10.10.2013

Auto Layout не поможет с высотой ячейки. Вам нужно будет установить это в tableView:heightForRowAtIndexPath. Я думаю, вы, вероятно, спрашиваете об этом, потому что высота ваших ячеек является переменной, а не фиксированной. т. е. они зависят от содержания.

Чтобы решить эту проблему, предварительно рассчитайте высоты ячеек и сохраните их в массиве. Верните значение для соответствующего indexPath в методе tableView:heightForRowAtIndexPath.

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

Если ваши расчеты интенсивны, делайте большую их часть с помощью main, за исключением методов, связанных с представлением, таких как sizeThatFits.

person Max MacLeod    schedule 11.07.2013

Я решил проблему, используя CGSize size = [view systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; в tableView:heightForRowAtIndexPath:.

person Chrizzor    schedule 27.11.2013

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

  • Назначить и внедрить источник данных и делегировать
  • Назначьте UITableViewAutomaticDimension для rowHeight и предполагаемойRowHeight
  • Реализовать методы делегата/источника данных (т.е. heightForRowAt и вернуть ему значение UITableViewAutomaticDimension)

Свифт:

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    // Swift 4.2 onwards
    table.rowHeight = UITableView.automaticDimension
    table.estimatedRowHeight = UITableView.automaticDimension


    // Swift 4.1 and below
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension

}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Swift 4.2 onwards
    return UITableView.automaticDimension

    // Swift 4.1 and below
    return UITableViewAutomaticDimension
}

Для экземпляра метки в UITableviewCell

  • Установить количество строк = 0 (и режим разрыва строки = обрезать конец)
  • Установите все ограничения (сверху, снизу, справа и слева) в отношении его контейнера superview/cell.
  • Необязательно: установите минимальную высоту для метки, если вы хотите, чтобы метка покрывала минимальную площадь по вертикали, даже если данных нет.

введите здесь описание изображения

person Krunal    schedule 24.10.2017