Я провел некоторое исследование, но не смог найти ни одного примера кода о том, как центрировать ячейки в UICollectionView по горизонтали.
вместо того, чтобы первая ячейка была похожа на эту X00 , я хочу, чтобы она была такой же, как эта 0X0 . есть ли способ добиться этого?
РЕДАКТИРОВАТЬ:
чтобы визуализировать то, что я хочу:
Мне нужно, чтобы он выглядел как версия B, когда в CollectionView есть только один элемент. Когда у меня больше одного элемента, тогда он должен быть похож на версию A, но с большим количеством элементов.
На данный момент это похоже на версию A, когда у меня всего 1 элемент, и мне интересно, как я могу сделать его похожим на B.
Спасибо за помощь!
Ответы:
Не рекомендуется использовать библиотеку, если ваша цель только в этом, например, для выравнивания по центру.
Лучше вы можете выполнить этот простой расчет в своей функции collectionViewLayout.
источник
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
значения следующим образом:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1
Swift 4.2
Swift 3
не забудьте добавить протокол
источник
Попробуйте это для Swift 4
Добавьте свою cellWidth вместо 165.0
источник
Я использую для этого KTCenterFlowLayout , и он отлично работает. Это настраиваемый подкласс,
UICollectionViewFlowLayout
который центрирует ячейки по вашему желанию. (Примечание: это нетривиальная задача, которую можно решить, разместив код, поэтому я связываюсь с проектом GitHub!)источник
Версия ответа Даршана Пателя на языке C :
источник
Немного изменив ответ @Safad Funy, это то, что сработало для меня в последней версии Swift и iOS. В этом случае я хотел, чтобы ширина ячеек составляла треть размера представления коллекции.
источник
Вы можете использовать это расширение (Swift 4).
Он может центрировать клетки, если у вас
collectionView
естьlayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Он работает с любым размером ячеек и отлично работает, когда
scrollDirection = .horizontal
Надеюсь, это вам поможет!
источник
Swift 4.2 (по горизонтали и вертикали). Это небольшое обновление кода Pink Panther и большое ему спасибо!
Убедитесь, что ваш класс соответствует протоколу UICollectionViewDelegateFlowLayout
источник
Вот более новая версия Swift 5, которая также отлично работает, когда ячейки составляют более одной строки:
Пожалуйста , убедитесь , что ваш класс Соответствует к
UICollectionViewDelegateFlowLayout
протоколу.источник
Swift 4
источник
Для людей, которые хотят добавить только отступы ( сверху, слева, снизу, справа ):
Добавить протокол
UICollectionViewDelegateFlowLayout
В этом примере показано заполнение слева и справа 40.
источник
SWIFT 4.2
//
источник
Вы можете попробовать мое решение, оно работает нормально,
источник
Принятая ответ правильный ответ , но если ваш
totalCellWidth
меньше , чемCollectionView
-хwidth
, но только , чтобы защититься от этого вы можете сделать , как показано ниже.источник
Этот код должен центрировать представление коллекции по горизонтали даже в Swift 4.0 без каких-либо изменений:
Убедитесь, что ваш класс соответствует
UICollectionViewDelegateFlowLayout
протоколуисточник
В итоге я выбрал совершенно другой подход, о котором, думаю, стоит упомянуть.
Я установил ограничение для представления моей коллекции, чтобы оно было выровнено по центру по горизонтали. Затем я устанавливаю другое ограничение, определяющее ширину. Я создал выход для ограничения ширины внутри моего viewController, который содержит представление коллекции. Затем, когда мой источник данных изменяется и я обновляю представление коллекции, я подсчитываю количество ячеек и выполняю (очень похожий) расчет для сброса ширины.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Затем я установил выход ограничения
.constant
равным результату расчета, а остальное делает автопрокладка.Это может конфликтовать с UICollectionViewDelegateFlowLayout, но у меня это отлично сработало, чтобы создать представление коллекции с выравниванием по левому краю. Без делегата это работает только тогда, когда ячейки заполняют большую часть представления.
источник
Общее решение для flowlayout, которое центрирует страницы, если они меньше ширины, и выравнивает по левому краю, если их больше.
Версия Swift (преобразованная из ObjC)
источник
У меня похожая ситуация в проекте, и я исправил ее, сославшись на
UPCarouselFlowLayout
Я думаю, это поддерживает
swift 5
версиюhttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Посмотрите на реализацию кода в
источник
Самый простой способ - установить для размера оценки представления коллекции значение Нет в раскадровке или с помощью кода
layout.estimatedItemSize = CGSize.zero
источник
Если есть место только для одной ячейки на группу, символы
leading:
иtrailing:
of.flexible(0)
центрируют ячейку по горизонтали:источник
Я использовал этот код в своем проекте. Он центрирует collectionView по горизонтали и вертикали в обоих направлениях
.horizontal
и.vertical
с использованием вставок раздела. Если задано, соблюдается интервал и исходная вставка раздела. Код для использования в делегате,UICollectionViewDelegateFlowLayout
чтобы у нас был доступ ко всем свойствам, которые нам нужно получить изUIcollectionView
или установить в раскадровке для повторного использования.Надеюсь, это кому-то поможет - он центрирует раздел, а не элементы внутри раздела, для большего мы должны создать подкласс
UICollectionViewFlowLayout
илиUICollectionViewLayout
как пример мозаики от Apple.источник
Я думаю, вам нужно центрировать ячейку, поэтому вместо использования collectionView я, как UITableView, будет очень полезен. Просто используйте UIViewController и поместите два UIViews спереди и сзади и поместите
UITableView
посередине Надеюсь, это поможетисточник