Я только начал изучать UICollectionViews. Мне интересно, знает ли кто-нибудь, как указать количество столбцов в коллекции. По умолчанию установлено значение 3 (iPhone / портрет). Я просмотрел документацию и не нашел краткого ответа.
101
UICollectionView
основном как сетку, потому что я знаю, что мне нужно только 4 столбца. Я делаю это, делая свои ячейки определенного размера, а расстояние между ними - определенного размера, поэтому в представлении коллекции отображаются только 4 столбца независимо от ориентации. Это похоже на то, что вам нужно?Ответы:
CollectionView очень эффективны, и за них приходится платить. Много и много вариантов. Как сказал ОМЗ:
Я бы предложил реализовать
<UICollectionViewDelegateFlowLayout>
протокол, предоставляя вам доступ к следующим методам, с помощью которых вы можете иметь больший контроль над своим макетомUICollectionView
без необходимости его подкласса:collectionView:layout:insetForSectionAtIndex:
collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
collectionView:layout:minimumLineSpacingForSectionAtIndex:
collectionView:layout:referenceSizeForFooterInSection:
collectionView:layout:referenceSizeForHeaderInSection:
collectionView:layout:sizeForItemAtIndexPath:
Кроме того, реализация следующего метода заставит ваш UICollectionView обновлять его макет при изменении ориентации: (скажем, вы хотите изменить размер ячеек для ландшафта и заставить их растягиваться)
Кроме того, вот два действительно хороших урока по
UICollectionViews
:http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
http://skeuo.com/uicollectionview-custom-layout-tutorial
источник
collectionView:layout:sizeForItemAtIndexPath:
ли обрабатывать все устройства отдельно?new GridLayoutManager(mContext, 4))
(4 столбца), очень просто или просто использоватьLinearLayoutManager
(в нем, конечно, только 1 столбец)В Swift 5 и iOS 12.3 вы можете использовать одну из 4 следующих реализаций , чтобы установить количество элементов в строке в вашем
UICollectionView
при управлении вставками и изменениями размера (включая поворот).№1. Подклассов
UICollectionViewFlowLayout
и использованиеUICollectionViewFlowLayout
«sitemSize
собственностиColumnFlowLayout.swift:
CollectionViewController.swift:
№2. Использование
UICollectionViewFlowLayout
«SitemSize
метод№3. Использование
UICollectionViewDelegateFlowLayout
«ScollectionView(_:layout:sizeForItemAt:)
метод№4. Подклассов
UICollectionViewFlowLayout
и использованиеUICollectionViewFlowLayout
«sestimatedItemSize
собственностиCollectionViewController.swift:
FlowLayout.swift:
Cell.swift:
источник
Я реализовал
UICollectionViewDelegateFlowLayout
на своемUICollectionViewController
и переопределил метод, отвечающий за определение размера ячейки. Затем я взял ширину экрана и разделил ее на требования к столбцу. Например, я хотел иметь по 3 столбца на каждом размере экрана. Итак, вот как выглядит мой код -источник
Расширение ответа нуба:
Это позволяет использовать любой интервал между ячейками. Предполагается, что вызывается
Int
переменная-член,numberOfItemsPerRow
а также все ячейки имеют квадратную форму и одинаковый размер. Как отмечено в ответе jhilgert00, мы также должны реагировать на изменения ориентации, но теперь использованиеviewWillTransitionToSize
aswillRotateToInterfaceOrientation
обесценивается.источник
Вот рабочий код Swift 3, чтобы иметь макет из двух столбцов:
Не стесняйтесь изменить "nbCol" на желаемое количество столбцов.
источник
Если вам лень использовать делегат.
PS: Должен вызываться и после вращения
источник
Обновлено до Swift 3:
Вместо потокового макета я предпочитаю использовать настраиваемый макет для определенного номера столбца и номера строки. Так как:
Обычная ячейка и ячейка заголовка: (добавьте UILabel как IBOutlet в свой xib):
Пользовательский макет:
CollectionView:
Используйте CollectionView из ViewController:
Наконец-то у вас может быть необычный CollectionView!
источник
Поскольку
UICollectionView
он настолько гибкий, есть несколько способов изменить количество столбцов, в зависимости от типа используемого макета.В
UICollectionViewFlowLayout
(что, вероятно, вы работаете) напрямую не указывает количество столбцов (потому что это зависит от размера / ориентации представления). Самый простой способ изменить это - установитьitemSize
свойство и / илиminimumInteritemSpacing
/minimumLineSpacing
.источник
Swift 3.0. Работает как для горизонтального, так и для вертикального направления прокрутки и с переменным интервалом
Укажите количество столбцов
Настроить
flowLayout
для рендеринга указанногоnumberOfColumns
источник
Обновлено до Swift 5+ iOS 13
Размер оценки Collectionview не должен быть пустым
Объявить маржу для ячейки
В viewDidLoad Configure
minimumInteritemSpacing
,minimumLineSpacing
,sectionInset
UICollectionViewDataSource метод
sizeForItemAt
источник
Все дело в макете, который вы хотите нарисовать. Вы можете создать собственный класс, унаследованный от UICollectionViewFlowLayout. В настоящее время нет прямого метода установки столбцов. Если вы хотите добиться такой функциональности, вам нужно сделать это вручную. Вам нужно обработать это в своем собственном классе макета потока.
Теперь возникнет вопрос, как вы это сделаете? Если вы не хотите беспокоить рамку ячейки, вы можете настроить
Другой способ - предоставить вам собственные позиции ячеек. Переопределив два нижеприведенных метода, которые будут вызываться во время формирования вашего макета.
UICollectionViewLayoutAttributes - это класс, который будет иметь дело с положением ячейки, кадром, Zindex и т. Д.
источник
Этот ответ предназначен для быстрой версии 3.0 ->
сначала соответствовать протоколу:
затем добавьте эти методы:
источник
Я просто хотел добавить к ответу Иману Пети №2. Чтобы поля были точными независимо от ширины экрана, я использую итеративный решатель с желаемым полем и количеством столбцов в качестве входных данных. Я также добавил флаг направления, где их конечные поля будут сравниваться с их целью.
Итерационный решатель показан ниже и возвращает cellWidth и margin.
Я называю это так:
Затем я применяю значения cellWidth и margin к макету потока как таковому:
{func collectionView (_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {return CGSize (width: cellWidth, height: cellWidth)}
}
Надеюсь это поможет. Вероятно, есть более простой способ обеспечить точность полей, но это один из способов. Кроме того, этот код не тестировался для устройств, которые позволяют вращать представления коллекций.
Спасибо,
источник
идеальным решением является использование UICollectionViewDelegateFlowLayout, но вы можете легко рассчитать ширину ячейки и разделить ее на желаемое количество столбцов, которые вы хотите
сложно сделать ширину без дроби
источник
Сделал макет коллекции.
Чтобы сделать разделитель видимым, установите серый цвет фона представления коллекции. По одной строке на раздел.
Использование:
Макет:
источник
Попробуйте это, он работает идеально для меня,
Выполните следующие шаги:
1. Определите значения в файле .h.
ИЛИ
2. Добавьте код в коллекцию. Методы источника данных макета просмотра, как показано ниже.
Надеюсь, это поможет кому-то.
источник
Сначала добавьте UICollectionViewDelegateFlowLayout в качестве протокола.
Затем:
источник