Tengo un UICollectionView
desplazamiento horizontal y siempre hay 2 celdas una al lado de la otra en toda la pantalla. Necesito que el desplazamiento se detenga al principio de una celda. Con la paginación habilitada, la vista de colección recorre toda la página, que son 2 celdas a la vez, y luego se detiene.
Necesito habilitar el desplazamiento por una sola celda o el desplazamiento por varias celdas deteniéndome en el borde de la celda.
Intenté crear una subclase UICollectionViewFlowLayout
e implementar el método targetContentOffsetForProposedContentOffset
, pero hasta ahora solo pude romper la vista de mi colección y dejó de desplazarse. ¿Hay alguna manera más fácil de lograr esto y cómo, o realmente necesito implementar todos los métodos de UICollectionViewFlowLayout
subclase? Gracias.
fuente
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
y desactivar la paginaciónRespuestas:
Bien, encontré la solución aquí: targetContentOffsetForProposedContentOffset: withScrollingVelocity sin subclasificar UICollectionViewFlowLayout
Debería haberlo buscado
targetContentOffsetForProposedContentOffset
al principio.fuente
simplemente anule el método:
fuente
Paginación horizontal con ancho de página personalizado (Swift 4 y 5)
Muchas de las soluciones presentadas aquí dan como resultado un comportamiento extraño que no parece una paginación implementada correctamente.
Sin embargo, la solución presentada en este tutorial no parece tener ningún problema. Se siente como un algoritmo de paginación que funciona perfectamente. Puedes implementarlo en 5 sencillos pasos:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
así:collectionView.delegate = self
UICollectionViewDelegate
través de una extensión:extension YourType: UICollectionViewDelegate { }
Agregue el siguiente método a la extensión que implementa la
UICollectionViewDelegate
conformidad y establezca un valor parapageWidth
:Agregue el siguiente método a la extensión que implementa la
UICollectionViewDelegate
conformidad, establezca el mismo valor parapageWidth
(también puede almacenar este valor en un lugar central) y establezca un valor paracollectionViewItemCount
:fuente
Pop back (against velocity)
pieza a:collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Tenga en cuenta el.centeredHorizontally
.left
estuvo bien.left
no funcionó como se esperaba. Parecía empujar la celda demasiado atrás @fredpiVersión Swift 3 de la respuesta de Evya:
fuente
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
luego agregue+ mod
después del+ Double(0.5)
Esta es la forma más fácil que encontré para hacer eso en Swift 4.2 para horinzontal desplazamiento :
Estoy usando la primera celda
visibleCells
y desplazándome hasta entonces, si la primera celda visible muestra menos de la mitad de su ancho, me estoy desplazando a la siguiente.Si su colección de desplazamiento vertical , basta con cambiar
x
pory
ywidth
porheight
fuente
En parte basado en la respuesta de StevenOjo. Probé esto usando un desplazamiento horizontal y sin Bounce UICollectionView. cellSize es el tamaño de CollectionViewCell. Puede ajustar el factor para modificar la sensibilidad de desplazamiento.
fuente
Aquí está mi implementación en Swift 5 para la paginación vertical basada en celdas:
Algunas notas:
itemSize
realmente coincide con el tamaño del elemento, ya que a menudo es un problema, especialmente cuando lo usacollectionView(_:layout:sizeForItemAt:)
, use una variable personalizada con itemSize en su lugar.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Aquí hay una versión horizontal (no la he probado a fondo, así que perdone cualquier error):
Este código se basa en el código que utilizo en mi proyecto personal, puede consultarlo aquí descargándolo y ejecutando el destino de ejemplo.
fuente
.fast
lugar deUIScollViewDecelerationRateFast
Enfoque 1: Vista de colección
flowLayout
esUICollectionViewFlowLayout
propiedadEnfoque 2: controlador de vista de página
Podría usar
UIPageViewController
si cumple con sus requisitos, cada página tendría un controlador de vista separado.fuente
Esta es una forma directa de hacer esto.
El caso es simple, pero finalmente bastante común (desplazamiento de miniaturas típico con tamaño de celda fijo y espacio fijo entre celdas)
Tenga en cuenta que no hay razón para llamar a scrollToOffset o sumergirse en diseños. El comportamiento de desplazamiento nativo ya lo hace todo.
Saludos a todos :)
fuente
collectionView.decelerationRate = .fast
una paginación por defecto mímica más cercana.Algo así como la respuesta de evya, pero un poco más suave porque no establece targetContentOffset en cero.
fuente
modificar la respuesta de Romulo BM para la escucha de velocidad
fuente
Rápido 5
Encontré una manera de hacer esto sin subclasificar UICollectionView, simplemente calculando el contentOffset en horizontal. Obviamente, sin isPagingEnabled establecido como verdadero. Aquí está el código:
fuente
Aquí está mi versión en Swift 3. Calcule el desplazamiento después de que finalice el desplazamiento y ajuste el desplazamiento con animación.
collectionLayout
es unUICollectionViewFlowLayout()
fuente
También puede crear una vista de desplazamiento falsa para manejar el desplazamiento.
Horizontal o vertical
fuente
Ok, las respuestas propuestas no funcionaron para mí porque quería desplazarme por secciones y, por lo tanto, tener tamaños de página de ancho variable
Hice esto (solo vertical):
En este caso, calculo cada tamaño de página de antemano usando la altura de la sección + encabezado + pie de página, y lo guardo en la matriz. Ese es el
pagesSizes
miembrofuente
Esta es mi solución, en Swift 4.2, desearía que pudiera ayudarlo.
fuente
fuente
La respuesta original de Олень Безрогий tenía un problema, por lo que en la última vista de colección de celdas se desplazaba al principio
fuente
Esta es mi manera de hacerlo usando a
UICollectionViewFlowLayout
para anulartargetContentOffset
:(Aunque al final, termino sin usar esto y uso UIPageViewController en su lugar).
fuente
Puede utilizar la siguiente biblioteca: https://github.com/ink-spot/UPCarouselFlowLayout
Es muy simple y, por lo general, no es necesario que piense en los detalles que contienen otras respuestas.
fuente
Creé un diseño de vista de colección personalizado aquí que admite:
es tan fácil como:
puede agregar PagingCollectionViewLayout.swift a su proyecto
o
agregar
pod 'PagingCollectionViewLayout'
a su podfilefuente