Вызов invalidateLayout () или reloadData () для перезагрузки UICollectionView, созданного из раскадровки после поворота устройства - PullRequest
0 голосов
/ 19 апреля 2019

В пределах UITableViewController, UITableViewCell у меня есть сетка с фиксированным числом статических UICollectionViewCells (без пробелов) на строку.

extension NounsTVC: UICollectionViewDataSource {

    func collectionView( _ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cellIds.count
    }

    func collectionView( _ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell( withReuseIdentifier: cellIds[indexPath.item], for: indexPath)
        cell.layer.borderColor = UIColor.gray.cgColor
        cell.layer.borderWidth = 0.5
        return cell
    }
}

extension NounsTVC: UICollectionViewDelegateFlowLayout
{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
    }

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

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

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let availableWidth = collectionView.bounds.size.width
        let minimumWidth = floor(availableWidth / cellsPerRow)
        let remainder = availableWidth - minimumWidth * CGFloat(cellsPerRow)

        let columnIndex = indexPath.row % Int(cellsPerRow)
        let cellWidth = CGFloat(columnIndex) < remainder ? minimumWidth + 1 : minimumWidth
        return CGSize(width: cellWidth, height: 45)
    }
}

Работает нормально.

Но, когда я поворачиваю устройство, оно должно вызвать эти методы компоновки.

Это похоже на ответ: Swift: Как обновить макет UICollectionView после поворота устройства

Но у меня нет UICollectionView как invalidLayout(), потому что UICollectionView создан в IB (насколько я понимаю), так как мне вызвать invalidateLayout на моем UICollectionView?

1 Ответ

0 голосов
/ 30 апреля 2019

В вышеуказанной ситуации были обнаружены две проблемы.

Во-первых, xcode не создавал IBOutlet в моем пользовательском UITableViewCell, перетаскивая линию между раскадровкой и файлом .swift (очевидно, это ошибка в некоторых созвездиях).,Решением было ввести код вручную и перетащить его, удерживая нажатой клавишу Ctrl, в обратном порядке к правильному представлению в раскадровке.

@IBOutlet weak var myCollectionView: UICollectionView!

Во-вторых, поскольку представление коллекции было создано в пользовательском UITableViewCell, онобыло невозможно использовать viewWillTransitionToSize: withTransitionCoordinator: или viewWillLayoutSubviews (методы табличного представления).Тем не менее, UITableViewCell имеет следующее, где .invalidateLayout () может быть вызвано:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
{
    super.traitCollectionDidChange(previousTraitCollection)
    guard previousTraitCollection != nil else
    { return }
    myCollectionView.collectionViewLayout.invalidateLayout()
}
...