Внутренний контент размером с UICollectionView внутри UITableView

Позвольте мне в предисловии сказать, что я провел, вероятно, 100 часов за последние несколько месяцев в поисках Google и Stackru, пытаясь ответить на этот вопрос. Я следовал многим урокам и не смог решить мою проблему. Каждый является большим разочарованием и разочаровывает.

ожидание

https://stackru.com/images/de83eba41d24488b82db8b37acd568e36760 ace9.png

реальность

проблема

У меня есть UITableView, который содержит UIView. UIView имеет автоматические ограничения макета, чтобы закрепить его на 15pt от краев ячейки, а затем я даю этому тень и закругленные углы. Внутри этого UIView у меня есть несколько меток, затем UICollectionView и представление стека.

Мой UICollectionView продолжает иметь высоту 0, и я не могу понять, как сделать так, чтобы он имел собственный размер. Единственный способ сделать так, чтобы он отображался правильно, - это принудительно задать ему определенную высоту с помощью автоматического макета внутри раскадровки (что я и сделал, чтобы сделать этот снимок экрана). К сожалению, форсировать такую ​​высоту нереально по двум причинам:

  1. Высота варьируется в зависимости от ширины устройства. Поскольку изображения представляют собой квадраты, высота свободно (но не точно) равна половине ширины устройства.
  2. Если изображений нет, высота представления коллекции должна быть 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 
Другие вопросы по тегам