UICollectionView sizeForItemAt Вызывается, но не правильно определен - PullRequest
0 голосов
/ 08 октября 2019

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

Я пытался использовать UICollectionViewDelegateFlowLayout и функцию делегата sizeForItemAt, чтобы установить размеры ячейки, но они не соответствуют заданным размерам дажеесли функция вызывается.

В настоящее время я устанавливаю вставки разделов, а затем вычисляю оставшуюся доступную ширину для ячеек в границах представления коллекции, после чего делю ширину на количество ячеек в строке.

class HomeCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    let sectionInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

    override func viewDidLoad() {
        super.viewDidLoad()

        self.collectionView?.contentInsetAdjustmentBehavior = .always
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 44)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return self.sectionInsets
    }

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

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

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        var numberOfItemsPerRow: CGFloat = 1
        var height: CGFloat = 0

        switch indexPath.section {
        case 0:
            numberOfItemsPerRow = 1
            height = 97
        case 1:
            numberOfItemsPerRow = 2
            height = 126
        default:
            break
        }

        let padding = self.sectionInsets.left * (numberOfItemsPerRow + 1)
        let availableWidth = collectionView.bounds.size.width - padding
        let width = availableWidth / numberOfItemsPerRow

        return CGSize(width: width, height: height)
    }
}

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

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

Кроме того, когда телефон переходит в альбомную ориентацию, он отображает его неправильно. Пример неправильного изображения ландшафта

Чтобы завершить мою проблему, ячейки первого раздела всегда должны занимать 100% доступной ширины. Если возможно, было бы очень хорошо, если бы они имели автоматическую высоту. Я пытался использовать UICollectionViewFlowLayout.automaticSize.height, но я не думаю, что это будет работать. Для второго раздела всегда требуется 50% доступной ширины.

1 Ответ

0 голосов
/ 08 октября 2019

Вы должны сделать недействительным макет на viewDidLayoutSubviews, чтобы пересчитать размеры для ячеек. Я приложил фрагмент кода. Попробуйте это

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews() 
    collectionView.collectionViewLayout.invalidateLayout()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...