UITableViewCell + Динамическая высота + Автоматическая компоновка
Я пришел из этого замечательного ответа:
Использование автоматической компоновки в UITableView для динамических раскладок ячеек и переменных высот строк
Я реализовал вещи, описанные в этом ответе, но я столкнулся с немного другим сценарием. У меня нет ни одного UILabel
, но вместо этого у меня есть динамический список UILabel
s.
Я создал изображение, показывающее некоторые разные случаи того, что должно выглядеть табличное представление:
В текущем состоянии репо ячейка не растет вертикально, чтобы соответствовать ячейке contentView
.
UPDATE
REPO: https://github.com/socksz/DynamicHeightCellAutoLayout
Если вы попытаетесь получить проект из репо и запустите его, вы можете точно увидеть, в чем проблема, о которой я говорю. Я не могу получить то, что отсутствует, чтобы он работал.
Ответы
Ответ 1
Проблема здесь в том, что вы используете сторонний компонент FXLabel, а не какой-либо код вокруг представлений таблиц или автоматический макет. Чтобы поддерживать автоматический макет, пользовательские подклассы UIView должны соответствующим образом реализовать метод -[intrinsicContentSize]
, а затем вызвать -[invalidateIntrinsicContentSize]
, когда что-то изменит его.
В этом случае FXLabel полагается на реализацию суперкласса (UILabel) для вышеуказанных методов, и поскольку UILabel не был предназначен для обработки разности переменных строк таким образом, что FXLabel реализует его, он не знает правильного intrinsicContentSize для возврата, и поэтому вычисления Auto Layout ошибочны (в этом случае, поскольку размер внутреннего содержимого слишком мал). Подробнее см. Раздел "Включение настраиваемых представлений для автоматической компоновки" эту отличную статью obcj.io.
Теперь хорошая новость заключается в том, что с iOS 6 вы сможете выполнить это, используя атрибутную строку в стандартном UILabel. Проверьте ответ на переполнение стека здесь.
Если по какой-то причине вам действительно нравится FXLabel, возможно, вы можете открыть проблему в проекте GitHub (или попытаться исправить ее самостоятельно и отправить запрос на перенос).
Ответ 2
Чтобы установить автоматический размер для высоты строки и оцениваемой высоты строки, выполните следующие шаги, чтобы сделать автоматическое измерение эффективным для раскладки высоты ячеек/строк.
- Назначить и реализовать dataSource и делегировать
- Назначить
UITableViewAutomaticDimension
для rowHeight и measuredRowHeight
- Внедрить методы делегирования /dataSource (т.е.
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
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
Для экземпляра ярлыка в UITableviewCell
- Установить количество строк = 0 (& режим прерывания строки = обрезать хвост)
- Задайте все ограничения (сверху, снизу, справа налево) относительно контейнера супервизора/ячейки.
- Необязательно: установите минимальную высоту для метки, если вы хотите, чтобы минимальная вертикальная область была покрыта меткой, даже если данных нет.