Внутренний контент размером с UICollectionView внутри UITableView
Позвольте мне в предисловии сказать, что я провел, вероятно, 100 часов за последние несколько месяцев в поисках Google и Stackru, пытаясь ответить на этот вопрос. Я следовал многим урокам и не смог решить мою проблему. Каждый является большим разочарованием и разочаровывает.
ожидание
https://stackru.com/images/de83eba41d24488b82db8b37acd568e36760 ace9.png
реальность
проблема
У меня есть UITableView, который содержит UIView. UIView имеет автоматические ограничения макета, чтобы закрепить его на 15pt от краев ячейки, а затем я даю этому тень и закругленные углы. Внутри этого UIView у меня есть несколько меток, затем UICollectionView и представление стека.
Мой UICollectionView продолжает иметь высоту 0, и я не могу понять, как сделать так, чтобы он имел собственный размер. Единственный способ сделать так, чтобы он отображался правильно, - это принудительно задать ему определенную высоту с помощью автоматического макета внутри раскадровки (что я и сделал, чтобы сделать этот снимок экрана). К сожалению, форсировать такую высоту нереально по двум причинам:
- Высота варьируется в зависимости от ширины устройства. Поскольку изображения представляют собой квадраты, высота свободно (но не точно) равна половине ширины устройства.
- Если изображений нет, высота представления коллекции должна быть 0.
Похоже, что здесь можно использовать внутренний размер содержимого макета потока.
Раскадровка
Ограничения
У меня есть около 15pt пространства между каждой из меток, представлением коллекции и представлением стека (таким образом, вертикальное пространство). В ячейке-прототипе коллекционного вида есть изображение. Представление изображения имеет верхнее, нижнее, заднее и начальное пространство, все установлены в 0 для ячейки представления коллекции, а также имеют соотношение 1:1.
Макет представления коллекции
Чтобы добиться макета одного большого изображения и 4 маленьких изображений, я использую SNCollectionViewLayout.
Источник данных / Делегат
В моем контроллере, в viewDidLoad
Я установил estimatedRowHeight
UITableView до 400, и я установил rowHeight
в UITableView.automaticDimension
,
В tableView cellForRowAt я снимаю повторно используемый UITableViewCell
класс, установить различные выходы в ячейке таблицы и вызвать reloadData()
в представлении коллекции для ячейки табличного представления. В раскадровке я установил ячейку табличного представления в качестве источника данных представления и делегата.
В табличном представлении ячейки awakeFromNib
у меня есть функция установки радиуса угла, тени и использования следующего кода для макета потока в представлении коллекции (что вы можете увидеть в их примере):
let snCollectionViewLayout = SNCollectionViewLayout()
snCollectionViewLayout.fixedDivisionCount = 4
snCollectionViewLayout.delegate = self
snCollectionViewLayout.itemSpacing = 10
collectionView.collectionViewLayout = snCollectionViewLayout
Я также реализовал необязательный SNCollectionViewLayoutDelegate
протокол, написав следующую функцию:
func scaleForItem(inCollectionView collectionView: UICollectionView, withLayout layout: UICollectionViewLayout, atIndexPath indexPath: IndexPath) -> UInt {
if indexPath.row == 0 || collectionView.numberOfItems(inSection: indexPath.section) <= 2 {
return 2
} else {
return 1
}
}
Эта функция - то, почему первое изображение в два раза больше высоты и ширины, чем остальные.
Исследование
Пытаясь понять это, я проверил collectionView.collectionViewLayout.collectionViewContentSize
внутри методов cellForRowAt и willDisplay ячейки табличного представления. В любом случае это (0,0).
Я также попытался проверить это в ячейках представления коллекции cellForItemAt и willDisplay. Эти строки журнала даже не печатаются, если я не добавлю ограничение высоты в представление коллекции, чтобы увеличить его, но тогда у меня не будет хорошего способа уменьшить высоту до того уровня, который должен быть, и в любое время я ' Попробовав, я получил противоречивые предупреждения об ограничениях и по-настоящему шаткие растянутые представления (например, представление стека было полностью сжатым).
В ходе тестирования я принудительно установил ограничение по высоте, достаточное для представления коллекции, и когда это происходит, оно отображается правильно, а размер содержимого представления коллекции является правильным, поэтому я знаю, что он способен отслеживать (что видно здесь)
У кого-нибудь есть понимание этого? Я был бы рад предоставить больше кода, если у вас есть какие-то подробности на вещи, чтобы разобраться. Я попытался дать полную картину, сохраняя ее как можно более короткой (я знаю, что она длинная).
Я чувствую, что проблема связана с тем, что представление коллекции находится внутри ячейки табличного представления.
Заранее спасибо.
1 ответ
Сохраняйте соединение с ограничением высоты в ячейке табличного представления.
@IBOutlet weak var collectionViewHeightConstraint: NSLayoutConstraint!
И обновите значение ограничения высоты программно согласно вычислениям высоты
self. collectionViewHeightConstraint.constant = 100 // set it to 0 if nothing to display