UICollectionViewLayout - 3 ячейки в 2 столбцах - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь создать UICollectionView с повторяющимся макетом из 7 ячеек, который выглядит следующим образом:

enter image description here

Однако с CollectionViewLayout я могу Кажется, 6-я и 7-я ячейки не попадают в один и тот же столбец.

Вот соответствующий код:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let collectionViewWidth = self.collectionView.bounds.width
        let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
        let spaceBetweenCells = flowLayout.minimumInteritemSpacing
        var adjustedWidth = collectionViewWidth - spaceBetweenCells

        if indexPath.row % 7 == 0 {
            return CGSize(width: collectionViewWidth, height: collectionViewWidth)
        }

        if indexPath.row % 7 == 1 || indexPath.row % 7 == 2 || indexPath.row % 7 == 3 {
            adjustedWidth = collectionViewWidth - (spaceBetweenCells * 2)
            return CGSize(width: floor(adjustedWidth / 3), height: floor(adjustedWidth / 3))
        }

        if indexPath.row % 7 == 4 {
            adjustedWidth = collectionViewWidth - spaceBetweenCells * 2
            return CGSize(width: floor(adjustedWidth / 3) * 2 + spaceBetweenCells, height: floor(adjustedWidth / 3) * 2 + spaceBetweenCells)
        }

        if indexPath.row % 7 == 5 || indexPath.row % 7 == 6 {
            adjustedWidth = collectionViewWidth - spaceBetweenCells * 2
            return CGSize(width: floor(adjustedWidth / 3), height: floor(adjustedWidth / 3))
        }

        let width: CGFloat = adjustedWidth / 2
        let height: CGFloat = width;
        return CGSize(width: width, height: height)
    }

И вот результат:

enter image description here

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


Обновление Я получил его на работу через UIStackViews, хотя и довольно раздражает.

enter image description here

1 Ответ

0 голосов
/ 03 февраля 2020

Это не будет легкой задачей, если использовать метод UICollectionViewFlowLayout sizeForItem. Вы должны будете использовать

if indexPath.row % 7 == 0 || indexPath.row % 7 == 4 {
    return CGSize(width: collectionViewWidth, height: collectionViewWidth)
}

А затем в методе cellForItemAt:

if indexPath.row % 7 == 4 {
    // Provide a UIStackView with your required layout
    // Or maybe even you could provide a smaller UICollectionView with just 3 cells, but that seems like overkill.
}
...