Как установить размер ячейки коллекции с помощью автоматического макета

Привет Я пытаюсь изменить размер ячейки через auto layout.

Я хочу отобразить ячейку по 3 на 3.

Первый край ячейки слева = 0

Последний разрез ячейки справа = 0

И все ячейки имеют 1pt. Как instagram.

введите описание изображения здесь

введите описание изображения здесь

Должен ли я установить размер ячейки? Я хочу установить ограничение через Autolayout.

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

Вот мой код:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSizeMake(123, 123);
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
    return 1;
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
    return 1;
}

Но.. Я думаю, что он точно не вычисляет размер ячейки.

Как установить размер ячейки в зависимости от размера экрана?

Мне нужно установить пространство 1pt между ячейками.

Можно ли вообще использовать раскадровку?

Если нет, как мне установить код?

Спасибо.

Ответы

Ответ 1

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

Вы можете легко вычислить размер из предоставленной вами информации. В collectionView(_:layout:sizeForItemAt:) вы можете получить доступ к границам collectionView для вычисления желаемого размера вашей ячейки:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    // Compute the dimension of a cell for an NxN layout with space S between
    // cells.  Take the collection view width, subtract (N-1)*S points for
    // the spaces between the cells, and then divide by N to find the final
    // dimension for the cell width and height.

    let cellsAcross: CGFloat = 3
    let spaceBetweenCells: CGFloat = 1
    let dim = (collectionView.bounds.width - (cellsAcross - 1) * spaceBetweenCells) / cellsAcross
    return CGSize(width: dim, height: dim)
}

Затем это работает для iPhones и iPads всех размеров.

Ответ 2

Отличный ответ на vacawama, но у меня было 2 вопроса. Я хотел, чтобы промежуток, который я определил в раскадровке, автоматически использовался.

введите описание изображения здесь

А во-вторых, я не мог заставить эту функцию вызывать, и никто не упоминал, как это сделать? Чтобы вызвать CollectionView sizeForItemAt, вам нужно расширить UICollectionViewDelegateFlowLayout вместо расширения UICollectionViewDelegate. Надеюсь, это поможет кому-то еще некоторое время.

extension MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let cellsAcross: CGFloat = 3
        var widthRemainingForCellContent = collectionView.bounds.width
        if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {
            let borderSize: CGFloat = flowLayout.sectionInset.left + flowLayout.sectionInset.right
            widthRemainingForCellContent -= borderSize + ((cellsAcross - 1) * flowLayout.minimumInteritemSpacing)
        }
        let cellWidth = widthRemainingForCellContent / cellsAcross
        return CGSize(width: cellWidth, height: cellWidth)
    }

}

Ответ 3

Я настроил его с помощью методов делегатов CollectionView. Это даст вам настройку 2xN, но вы можете легко сделать ее 3xN. Вот скриншот, и вы можете обратиться к моему проекту на GitHub...

https://github.com/WadeSellers/GoInstaPro

Снимок экрана макета коллекции CollectionView

Ответ 4

Код версии Swift 3 на основе ответа vacawama:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let cellsAcross: CGFloat = 3
        let spaceBetweenCells: CGFloat = 1
        let dim = (collectionView.bounds.width - (cellsAcross - 1) * spaceBetweenCells) / cellsAcross

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

Ответ 5

Вот еще одно решение, но оно работает только на iPhone6.

Я буду пытаться обновить для iphone5/6plus

Особая благодарность @vacawama!

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {


        // Compute the dimension of a cell for an NxN layout with space S between
        // cells.  Take the collection view width, subtract (N-1)*S points for
        // the spaces between the cells, and then divide by N to find the final
        // dimension for the cell width and height.

        let cellsAcross: CGFloat = 3
        let spaceBetweenCells: CGFloat = 1
        let dim = (collectionView.bounds.width - (cellsAcross - 1) * spaceBetweenCells) / cellsAcross
                print(indexPath.row)

        var width = dim

        //last cell width
        if(  (indexPath.row + 1) % 3 == 0){
            width = 124

        }else {
            width = 124.5
        }
        print(width)
        return CGSizeMake(width, dim)

    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
        return 1;
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
        return 1;
    }