Eu tenho UICollectionView
com rolagem horizontal e sempre há 2 células lado a lado por toda a tela. Preciso que a rolagem pare no início de uma célula. Com a paginação ativada, a visualização da coleção rola a página inteira, que é 2 células de uma vez, e então para.
Preciso habilitar a rolagem por uma única célula ou a rolagem por várias células com parada na borda da célula.
Tentei criar uma subclasse UICollectionViewFlowLayout
e implementar o método targetContentOffsetForProposedContentOffset
, mas até agora só consegui quebrar a visualização da minha coleção e ela parou de rolar. Existe alguma maneira mais fácil de conseguir isso e como, ou eu realmente preciso implementar todos os métodos da UICollectionViewFlowLayout
subclasse? Obrigado.
ios
objective-c
uicollectionview
uicollectionviewlayout
Martin Koles
fonte
fonte
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
e desligue a paginaçãoRespostas:
OK, então encontrei a solução aqui: targetContentOffsetForProposedContentOffset: withScrollingVelocity sem subclassificar UICollectionViewFlowLayout
Eu deveria ter procurado
targetContentOffsetForProposedContentOffset
no início.fonte
apenas substitua o método:
fonte
Paginação horizontal com largura de página personalizada (Swift 4 e 5)
Muitas soluções apresentadas aqui resultam em algum comportamento estranho que não parece uma paginação devidamente implementada.
A solução apresentada neste tutorial , no entanto, não parece ter nenhum problema. Parece um algoritmo de paginação funcionando perfeitamente. Você pode implementá-lo em 5 etapas simples:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
assim:collectionView.delegate = self
UICollectionViewDelegate
por meio de uma extensão:extension YourType: UICollectionViewDelegate { }
Adicione o seguinte método à extensão que implementa a
UICollectionViewDelegate
conformidade e defina um valor parapageWidth
:Adicione o seguinte método à extensão que implementa a
UICollectionViewDelegate
conformidade, defina o mesmo valor parapageWidth
(você também pode armazenar esse valor em um local central) e defina um valor paracollectionViewItemCount
:fonte
Pop back (against velocity)
parte a ser:collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Observe o.centeredHorizontally
.left
estava bom.left
não funcionou como esperado. Pareceu empurrar a célula muito para trás @fredpiVersão Swift 3 da resposta de Evya:
fonte
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
então adicione+ mod
após o+ Double(0.5)
Esta é a maneira mais fácil que encontrei de fazer isso no Swift 4.2 para rolagem horinzontal :
Estou usando a primeira célula
visibleCells
e rolando para ela, se a primeira célula visível estiver mostrando menos da metade de sua largura, estou rolando para a próxima.Se sua coleção de rolagem vertical , simplesmente mudar
x
pory
ewidth
porheight
fonte
Parcialmente baseado na resposta de StevenOjo. Eu testei isso usando uma rolagem horizontal e sem Bounce UICollectionView. cellSize é o tamanho de CollectionViewCell. Você pode ajustar o fator para modificar a sensibilidade de rolagem.
fonte
Esta é minha implementação no Swift 5 para paginação vertical baseada em células:
Algumas notas:
itemSize
realmente corresponde ao tamanho do item, pois isso costuma ser um problema, especialmente ao usarcollectionView(_:layout:sizeForItemAt:)
, use uma variável personalizada com o itemSize.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Aqui está uma versão horizontal (não testei completamente, então, perdoe quaisquer erros):
Este código é baseado no código que uso em meu projeto pessoal, você pode conferi-lo aqui baixando-o e executando o destino Exemplo.
fonte
.fast
vez deUIScollViewDecelerationRateFast
Abordagem 1: Visualização da coleção
flowLayout
éUICollectionViewFlowLayout
propriedadeAbordagem 2: Controlador de visualização de página
Você pode usar,
UIPageViewController
se atender aos seus requisitos, cada página terá um controlador de visualização separado.fonte
Esta é uma maneira direta de fazer isso.
O caso é simples, mas finalmente bastante comum (scroller de miniaturas típico com tamanho de célula fixo e lacuna fixa entre as células)
Observe que não há razão para chamar um scrollToOffset ou mergulhar nos layouts. O comportamento de rolagem nativo já faz tudo.
Saúde a todos :)
fonte
collectionView.decelerationRate = .fast
para paginação padrão mimmic mais próxima.Mais ou menos como a resposta de evya, mas um pouco mais suave porque não define targetContentOffset como zero.
fonte
Swift 5
Eu descobri uma maneira de fazer isso sem subclassificar UICollectionView, apenas calculando o contentOffset na horizontal. Obviamente, sem isPagingEnabled definido como true. Aqui está o código:
fonte
Aqui está minha versão em Swift 3. Calcule o deslocamento após o término da rolagem e ajuste o deslocamento com animação.
collectionLayout
é umUICollectionViewFlowLayout()
fonte
Além disso, você pode criar uma exibição de rolagem falsa para lidar com a rolagem.
Horizontal ou vertical
fonte
modificar a resposta Romulo BM para escuta de velocidade
fonte
Ok, então as respostas propostas não funcionaram para mim porque eu queria rolar por seções em vez disso e, portanto, ter tamanhos de página de largura variável
Eu fiz isso (apenas vertical):
Neste caso, eu calculo cada tamanho de página com antecedência usando a altura da seção + cabeçalho + rodapé, e armazeno no array. Esse é o
pagesSizes
membrofonte
Esta é a minha solução, no Swift 4.2, gostaria que pudesse ajudá-lo.
fonte
fonte
Aqui está minha maneira de fazer isso usando um
UICollectionViewFlowLayout
para substituir otargetContentOffset
:(Embora no final, eu acabe não usando isso e use UIPageViewController em vez disso.)
fonte
Você pode usar a seguinte biblioteca: https://github.com/ink-spot/UPCarouselFlowLayout
É muito simples e, claro, você não precisa pensar em detalhes como as outras respostas contêm.
fonte
Eu criei um layout de exibição de coleção personalizado aqui que suporta:
é tão fácil quanto:
você pode simplesmente adicionar PagingCollectionViewLayout.swift ao seu projeto
ou
adicione
pod 'PagingCollectionViewLayout'
ao seu podfilefonte