Вычисление sizeForItemAt для UICollectionViewDelegateFlowLayoutIOS

Программируем под IOS
Ответить
Anonymous
 Вычисление sizeForItemAt для UICollectionViewDelegateFlowLayout

Сообщение Anonymous »

Я возился с API астрономической картины дня НАСА и пытаюсь показать изображения в виде коллекции с тремя элементами в строке. Как и ожидалось, я использую UICollectionViewDelegateFlowLayout. Чтобы определить размер каждого изображения, я использую метод sizeForItemAt. На высоком уровне я беру ширину представления коллекции, вычитаю заполнение, определенное в других методах делегата, и делю оставшееся пространство на желаемое количество столбцов (3). Удивительно, но кажется, что мои расчеты немного ошибочны, потому что я получаю только 2 столбца с довольно большим пространством посередине (и дело не только в том, что некоторые гипотетические изображения в середине еще не завершили загрузку!).
Изображение

Кто-нибудь знает, что здесь происходит? Вот мой код:

Код: Выделить всё

    extension ApodCollectionViewController: UICollectionViewDelegateFlowLayout {
fileprivate enum Constants {
static let numColumns = 3.0
static let spacing = 10.0
}

/// This gives size of each item.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let availableWidth = collectionView.bounds.width - ((Constants.numColumns+1)*Constants.spacing)
let widthPer = availableWidth/Constants.numColumns
return CGSize(width: widthPer, height: widthPer)
}

/// This gives inset around entire collection view.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: Constants.spacing, left: Constants.spacing, bottom: Constants.spacing, right: Constants.spacing)
}

/// This gives space between items (horizontal).
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return Constants.spacing
}

/// This gives space between rows (vertical).
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return Constants.spacing
}
}
Я распечатал ширину границ CollectionView, чтобы убедиться, что это не было неожиданностью. На самом деле это 402 — ожидаемое количество точек, определяющее ширину экрана iPhone 16 Pro.
У кого-нибудь есть идеи? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/792 ... flowlayout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»