Вариант использования: самоизмерение UICollectionView с пользовательским UICollectionViewFlowLayout (ячейки коллекций выровнены по левому краю) внутри самоопределения UITableCell.
Проблема: попытка использовать collectionViewLayout.collectionViewContentSize для определения высоты ячейки таблицы - Я получаю неверное значение
Что было найдено: для решения проблемы я попытался переопределить свойство collectionViewContentSize и вычислить его вручную (используя layoutAttributesForItem (at: indexPath) .frame.height) - я получил тот же результат, но выяснили, это называется много раз. И во время последнего вызова он выдает правильное значение. Таким образом, похоже, что коллекция не знает правильный размер ячейки коллекции, когда я ее запрашиваю.
Я использовал два места для установки размера ячейки таблицы с одинаковым результатом:
- Как описано здесь
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
// `collectionView.contentSize` has a wrong width because in this nested example, the sizing pass occurs before te layout pass,
// so we need to force a force a layout pass with the corredt width.
self.contentView.frame = self.bounds
self.contentView.layoutIfNeeded()
// Returns `collectionView.contentSize` in order to set the UITableVieweCell height a value greater than 0.
return self.collectionView.collectionViewLayout.collectionViewContentSize
}
Использование collectionView.collectionViewLayout.collectionViewContentSize.height в качестве ограничения на collectionView после
reloadData()
вызова.
Может быть, smd может пролить свет - как решить проблему или где я пропускаю некоторое понимание
Спасибо заранее
ОБНОВЛЕНИЕ: Я нашел работу следующим подходом:
// ... some code
collectionView.reloadData()
// ... some code
// Fires about ten times
collectionView.rx.observe(CGSize.self, #keyPath(UICollectionView.contentSize))
.debounce(0.1, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe(onNext: { [weak self] size in
// Regardless debounce+distinct it's still possible to come inside twice
UIView.setAnimationsEnabled(false)
self?.parentTableView?.performBatchUpdates(nil)
UIView.setAnimationsEnabled(true)
})
.disposed(by: viewModelBag)
// ... some code
Таким образом, после вызова performBatchUpdates
- systemLayoutSizeFitting
срабатывает с правильным значением collectionView.contentSize
.
Но я все еще открыт для любых ясных / элегантных предложений, как я не хотел бы go жить с этим