Ошибка, которую вы получаете, указывает на ширину элемента, так как проблема, по сути, говорит о том, что ширина и интервал между элементами не могут превышать ширину представления коллекции. Это связано с тем, что представление вашей коллекции имеет вертикальную прокрутку.
Таким образом, чтобы обеспечить правильное поведение для представления коллекции, вы должны установить контроллер как delegate
для представления коллекции и также принять UICollectionViewDelegateFlowLayout
. В вашем случае я вижу, что вы уже реализовали метод collectionView(_:, layout:, sizeForItemAt:
.
В вашей реализации есть явное намерение разделить ширину collectionView на три равные части. В расчете учитывается третья часть из self.view.width
минус восемь. Если я правильно предполагаю, что вы намерены оставить интервал между элементами 8. Если это так, вы должны указать его в другом методе:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 8
}
Это будет указывать интервал между элементами до 8 баллов.
Продолжая с width
и height
ячейки, вы должны затем разделить collectionView.frame.width
, но перед этим вы должны вычесть промежуточное значение из этой величины , потому что этоэто оставшееся пространство для ваших ячеек.
Таким образом, ваша реализация будет
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// We subtract 16 because there are 2 inter item spaces like:
// [CELL] [spacing:8] [CELL] [spacing:8] [CELL]
let usableWidth = collectionView.frame.width - (2 * 8)
let cellWidth: CGFloat = usableWidth / 3
let cellHeight: CGFloat = cellWidth
return CGSize(width: cellWidth, height: cellHeight)
}
Это должно сделать макет для вас.