Как обновить UICollectionView внутри UITableViewCell после перехода в альбомную ориентацию - PullRequest
0 голосов
/ 28 мая 2020

У меня есть следующий collectionView:
https://youtu.be/dY2MDeFINEY

Я хочу, чтобы изображения оставались центрированными во время переходов в альбомной ориентации, и даже "страничное поведение" collectionView должно Остаться.
Для этого я попробовал несколько вещей. Мой текущий код (только для перехода) выглядит следующим образом:
Код TableViewController, который содержит TableViewCell с collectionView:

...
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        let indexPath = IndexPath(row: 1, section: 0)//The position of the row doesn't change
        let cell = tableView.cellForRow(at: indexPath) as? PlantDetailImageTableViewCell
        tableView.reloadData()
        cell?.respondToTransition()
    }
...

Метод responseToTransition (внутри TableViewCell, который содержит collectionView) выглядит так:

func respondToTransition() {
        collectionView.collectionViewLayout.invalidateLayout()
        let indexPath = IndexPath(item: pageControl.currentPage, section: 0)

        DispatchQueue.main.async {
            self.pageControl.currentPage = indexPath.row
            self.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
        }
    }

Моя схема потока следующая:

extension PlantDetailImageTableViewCell: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return collectionView.frame.size
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        pageControl.currentPage = Int(self.collectionView.contentOffset.x / self.collectionView.frame.size.width)
    }
}

Результат на переход к ландшафту следующий:
https://youtu.be/RlTX0LgfKEY

Как мне заставить изображения оставаться по центру. Вдобавок кажется, что collectionView «потерял» «немного» своего «поведения разбиения на страницы».
Отладчик представлений Xcode показывает следующее для ландшафта (отмеченный синим цветом - это изображение внутри ячейки collectionView):
Xcode view debugger

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ:
Проблема возникает только тогда, когда я пытаюсь изменить go с книжной на альбомную. Так что, если я запускаю приложение в альбомной ориентации, все работает как положено.

1 Ответ

0 голосов
/ 29 мая 2020

Я нашел решение проблемы.
Как LeoDabus упомянул в разделе комментариев, вызов tableView.reloadData() в TableViewController не нужен. Я удалил это и, кроме того, заменил respondToTransition() следующим:

func respondToTransition() {
    collectionView.collectionViewLayout.invalidateLayout()
    let indexPath = IndexPath(item: pageControl.currentPage, section: 0)

    DispatchQueue.main.async {
        self.collectionView.reloadData()//!!!
        self.pageControl.currentPage = indexPath.row
        self.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    }
}

Моя схема потока все та же ...

...