Собственный размер UICollectionView внутри самого собственного размера UITableCell, collectionViewContentSize возвращает неправильное значение - PullRequest
0 голосов
/ 02 апреля 2020

Вариант использования: самоизмерение UICollectionView с пользовательским UICollectionViewFlowLayout (ячейки коллекций выровнены по левому краю) внутри самоопределения UITableCell.

Проблема: попытка использовать collectionViewLayout.collectionViewContentSize для определения высоты ячейки таблицы - Я получаю неверное значение

Что было найдено: для решения проблемы я попытался переопределить свойство collectionViewContentSize и вычислить его вручную (используя layoutAttributesForItem (at: indexPath) .frame.height) - я получил тот же результат, но выяснили, это называется много раз. И во время последнего вызова он выдает правильное значение. Таким образом, похоже, что коллекция не знает правильный размер ячейки коллекции, когда я ее запрашиваю.

Я использовал два места для установки размера ячейки таблицы с одинаковым результатом:

  1. Как описано здесь
    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 жить с этим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...