Eu fiz algumas pesquisas, mas não consegui encontrar nenhum exemplo de código sobre como centralizar células em um UICollectionView horizontalmente.
em vez de a primeira célula ser como esta X00 , quero que seja assim 0X0 . Existe alguma maneira de conseguir isso?
EDITAR:
para visualizar o que eu quero:
Eu preciso que ele se pareça com a versão B quando houver apenas um elemento no CollectionView. Quando obtive mais de um elemento, deveria ser como a versão A, mas com mais elementos.
No momento, parece a Versão A, quando tenho apenas 1 elemento, e me pergunto como posso fazê-la parecer B.
Obrigado pela ajuda!
Respostas:
Não é uma boa ideia usar uma biblioteca, se o seu objetivo for apenas isso, ou seja, centralizar o alinhamento.
Melhor você pode fazer esse cálculo simples em sua função collectionViewLayout.
fonte
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
valoriza assim:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1
Swift 4.2
Swift 3
não esqueça de adicionar o protocolo
fonte
Tente isso para o Swift 4
Adicione sua cellWidth em vez de 165.0
fonte
Eu uso o KTCenterFlowLayout para isso e funciona muito bem. É uma subclasse personalizada
UICollectionViewFlowLayout
que centraliza as células como você deseja. (Nota: isso não é algo trivial a ser resolvido postando algum código, e é por isso que estou vinculando a um projeto do GitHub!)fonte
Uma versão C do objetivo da resposta de Darshan Patel :
fonte
Modificando ligeiramente a resposta do @Safad Funy, foi isso que funcionou para mim na versão mais recente do Swift e iOS. Nesse caso, eu queria que a largura das células fosse um terço do tamanho da visualização da coleção.
fonte
Você pode usar esta extensão (Swift 4).
Pode centralizar as células se você
collectionView
tiverlayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Funciona com qualquer tamanho de célula e funciona perfeitamente quando
scrollDirection = .horizontal
Espero que seja de ajuda!
fonte
Swift 4.2 (horizontal e vertical). É uma pequena atualização do código da Pantera Cor-de-Rosa e muito obrigado!
Verifique se sua classe está em conformidade com o protocolo UICollectionViewDelegateFlowLayout
fonte
Aqui está a versão mais recente do Swift 5, que também funciona bem quando as células têm mais de uma linha:
Certifique-se de que sua classe esteja em conformidade com o
UICollectionViewDelegateFlowLayout
protocolo.fonte
Swift 4
fonte
Para as pessoas que desejam adicionar apenas um preenchimento ( superior, esquerdo, inferior, direito ):
Adicione o protocolo
UICollectionViewDelegateFlowLayout
Este exemplo mostra um preenchimento esquerdo e direito com 40.
fonte
SWIFT 4.2
//
fonte
Você pode tentar minha solução, funciona bem,
fonte
A resposta aceita é a resposta certa, mas se o seu
totalCellWidth
é menor do que osCollectionView
'swidth
, mas apenas para se proteger contra isso, você pode fazer como abaixo.fonte
Esse código deve centralizar a exibição de coleção horizontalmente, mesmo no Swift 4.0 sem nenhuma modificação:
Verifique se sua classe está em conformidade com o
UICollectionViewDelegateFlowLayout
protocolofonte
Acabei adotando uma abordagem completamente diferente aqui, que acredito que vale a pena mencionar.
Defino uma restrição na exibição da minha coleção para ser alinhada horizontalmente no centro. Em seguida, defino outra restrição que especifica a largura. Eu criei uma saída para a restrição de largura dentro do meu viewController que mantém a exibição de coleção. Em seguida, quando minha fonte de dados é alterada e estou atualizando a exibição da coleção, tomo a contagem das células e faço um cálculo (muito semelhante) para redefinir a largura.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Em seguida, defino o
.constant
valor da saída da restrição como resultado do cálculo e o layout automático faz o resto.Isso pode entrar em conflito com o `UICollectionViewDelegateFlowLayout, mas funcionou perfeitamente para criar uma exibição de coleção justificada à esquerda. Sem um delegado, ele parece funcionar apenas quando as células preenchem a maioria da exibição.
fonte
Solução geral para o layout de fluxo que centraliza as páginas se elas forem menores que a largura e alinhar à esquerda se houver mais
Versão Swift (convertida de ObjC)
fonte
Eu tenho uma situação semelhante no projeto, e eu o corrigi referindo-me
UPCarouselFlowLayout
Eu acho que suporta
swift 5
versãohttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Veja a implementação do código em
fonte
a maneira mais simples é definir o tamanho da estimativa da exibição de coleção como Nenhum no storyboard ou com código
layout.estimatedItemSize = CGSize.zero
fonte
Se só há espaço para uma célula por grupo, de um
leading:
etrailing:
de.flexible(0)
vai centrar a célula horizontalmente:fonte
Eu usei esse código em um projeto. Centraliza o collectionView horizontalmente e verticalmente em ambas as direções
.horizontal
e.vertical
usando as inserções da seção. Respeita o espaçamento e a inserção original da seção, se configurada. Código a ser usado no delegadoUICollectionViewDelegateFlowLayout
para termos acesso a todas as propriedades que precisamos recuperar doUIcollectionView
ou definido no storyboard para reutilização.Espero que ajude alguém - ele centraliza a seção e não os itens dentro da seção; para mais, temos que subclassificar o
UICollectionViewFlowLayout
ouUICollectionViewLayout
como exemplo de mosaico da Apple.fonte
Eu acho que você precisa centralizar a célula, então, em vez de usar o collectionView, como o UITableView, será de grande utilidade. Basta usar um UIViewController e colocar duas UIViews na frente e atrás e colocar uma
UITableView
no meio. Espero que isso ajudefonte