У меня UICollectionView
с горизонтальной прокруткой всегда есть 2 ячейки бок о бок на весь экран. Мне нужно, чтобы прокрутка останавливалась в начале ячейки. При включенном разбиении по страницам представление коллекции прокручивает всю страницу, то есть 2 ячейки одновременно, а затем останавливается.
Мне нужно включить прокрутку по одной ячейке или прокрутку по нескольким ячейкам с остановкой на краю ячейки.
Я попытался создать подкласс UICollectionViewFlowLayout
и реализовать метод targetContentOffsetForProposedContentOffset
, но пока мне удалось только сломать представление моей коллекции, и прокрутка прекратилась. Есть ли более простой способ добиться этого и как, или мне действительно нужно реализовать все методы UICollectionViewFlowLayout
подкласса? Спасибо.
источник
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
и отключение пейджингаОтветы:
Хорошо, поэтому я нашел здесь решение: targetContentOffsetForProposedContentOffset: withScrollingVelocity без подкласса UICollectionViewFlowLayout
Я должен был искать
targetContentOffsetForProposedContentOffset
с самого начала.источник
просто переопределите метод:
источник
Горизонтальная разбивка на страницы с настраиваемой шириной страницы (Swift 4 и 5)
Многие представленные здесь решения приводят к странному поведению, которое не похоже на правильно реализованную подкачку.
Однако решение, представленное в этом руководстве , похоже, не вызывает никаких проблем. Это просто отлично работает алгоритм подкачки. Вы можете реализовать это за 5 простых шагов:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
так:collectionView.delegate = self
UICollectionViewDelegate
через расширение:extension YourType: UICollectionViewDelegate { }
Добавьте следующий метод к расширению, реализующему
UICollectionViewDelegate
соответствие, и установите значение дляpageWidth
:Добавьте следующий метод к расширению, реализующему
UICollectionViewDelegate
соответствие, установите такое же значение дляpageWidth
(вы также можете сохранить это значение в центральном месте) и установите значение дляcollectionViewItemCount
:источник
Pop back (against velocity)
часть , чтобы быть:collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Обратите внимание на.centeredHorizontally
.left
было хорошо.left
это не сработало, как ожидалось. Кажется, ячейка отодвинулась слишком далеко назад @fredpiSwift 3 версия ответа Эвьи:
источник
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
затем добавьте+ mod
после+ Double(0.5)
Вот самый простой способ, который я нашел в Swift 4.2 для горизонтальной прокрутки:
Я использую первую ячейку
visibleCells
и прокручиваю до этого момента, если первая видимая ячейка показывает меньше половины ее ширины, я прокручиваю к следующей.Если ваша коллекция Scroll вертикально , просто изменить с
x
помощьюy
и сwidth
помощьюheight
источник
Вот моя реализация в Swift 5 для вертикального разбиения по страницам на основе ячеек:
Некоторые примечания:
itemSize
действительно ли ваш размер соответствует размеру элемента, поскольку это часто проблема, особенно при использованииcollectionView(_:layout:sizeForItemAt:)
, вместо этого используйте пользовательскую переменную с itemSize.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Вот горизонтальная версия (тщательно не тестировала, простите, пожалуйста, за ошибки):
Этот код основан на коде, который я использую в своем личном проекте, вы можете проверить его здесь , загрузив его и запустив целевой объект Example.
источник
.fast
вместоUIScollViewDecelerationRateFast
Частично на основе ответа Стивена Оджо. Я тестировал это с помощью горизонтальной прокрутки и без Bounce UICollectionView. cellSize - это размер CollectionViewCell. Вы можете настроить коэффициент, чтобы изменить чувствительность прокрутки.
источник
Подход 1: просмотр коллекции
flowLayout
этоUICollectionViewFlowLayout
собственностьПодход 2: Контроллер просмотра страницы
Вы можете использовать,
UIPageViewController
если это соответствует вашим требованиям, каждая страница будет иметь отдельный контроллер представления.источник
Это простой способ сделать это.
Случай простой, но, наконец, довольно распространенный (типичный скроллер эскизов с фиксированным размером ячейки и фиксированным промежутком между ячейками)
Обратите внимание, что нет причин вызывать scrollToOffset или углубляться в макеты. Собственное поведение прокрутки уже все делает.
Всем привет :)
источник
collectionView.decelerationRate = .fast
более близкую иммиграционную подкачку по умолчанию.Вроде как ответ эвьи, но немного более плавный, потому что он не устанавливает targetContentOffset в ноль.
источник
изменить ответ Romulo BM для скоростного прослушивания
источник
Swift 5
Я нашел способ сделать это без создания подкласса UICollectionView, просто вычислив contentOffset по горизонтали. Очевидно, что для isPagingEnabled не установлено значение true. Вот код:
источник
Вот моя версия в Swift 3. Рассчитайте смещение после завершения прокрутки и настройте смещение с помощью анимации.
collectionLayout
этоUICollectionViewFlowLayout()
источник
Также вы можете создать поддельный вид прокрутки для обработки прокрутки.
Горизонтальный или вертикальный
источник
Хорошо, поэтому предлагаемые ответы не сработали для меня, потому что я хотел вместо этого прокручивать по разделам и, таким образом, иметь размеры страниц переменной ширины
Я сделал это (только по вертикали):
В этом случае я заранее рассчитываю размер каждой страницы, используя высоту раздела + заголовок + нижний колонтитул, и сохраняю его в массиве. Это
pagesSizes
членисточник
Это мое решение в Swift 4.2, я бы хотел, чтобы оно вам помогло.
источник
источник
В исходном ответе Олень Безрогий возникла проблема, поэтому в последнем представлении коллекции ячеек прокручивалась в начало
источник
Вот мой способ сделать это,
UICollectionViewFlowLayout
переопределивtargetContentOffset
:(Хотя в конечном итоге я не использую это и вместо этого использую UIPageViewController.)
источник
Вы можете использовать следующую библиотеку: https://github.com/ink-spot/UPCarouselFlowLayout
Это очень просто, и, конечно, вам не нужно думать о деталях, которые содержатся в других ответах.
источник
я создал макет пользовательского просмотра коллекции здесь , что поддерживает:
это так просто, как:
вы можете просто добавить PagingCollectionViewLayout.swift в свой проект
или
добавить
pod 'PagingCollectionViewLayout'
в свой подфайлисточник