Проблема с автоматическим определением размеров ячеек внутри автоматически измеряемых ячеек немного сложна, потому что вы должны понимать, как это работает. UITableView
работает с оценками большую часть времени. Обычно он не вычисляет contentSize
точно, потому что для точного вычисления ему необходимо сначала создать экземпляр каждой ячейки, расположить ее, а затем вычислить ее размер.
Точные значения рассчитываются только для отображаемых ячеек (видимых в текущем кадре прокрутки).
Сложность в том, что внутренние ячейки (внутри вашей внешней ячейки) не отображаются, пока не будет отображена внешняя ячейка, поэтому внешняя ячейка не имеет правильно рассчитанного размера. Также обратите внимание, что UITableView
не обновляет автоматически высоту ячейки, если явно не указано иное.
Решение, если вам действительно нужно это сделать, - правильно рассчитать высоту внешней ячейки перед ее отображением и вручную установить ограничение высоты.
Если вы знаете высоту (из источника данных), это легко. Если вам действительно нужно вычислить высоту внутренней таблицы, вы можете сделать что-то вроде этого:
// make the table high enough to display all cells
innerTableHeightConstraint.constant = 2000
// reload table
innerTable.reloadData()
// force layout
innerTable.layoutIfNeeded()
// now the contentSize is correctly calculated
innerTableHeightConstraint.constant = innerTable.contentSize.height
Вся концепция хитрая, и в идеале вам лучше использовать UICollectionView
или разделы таблицы. Когда вы используете представления внутренних таблиц, для внутренних таблиц повторное использование ячеек не будет, и ваша производительность пострадает.