Estou usando um UICollectionView
com UICollectionViewFlowLayout
.
Eu defino o tamanho de cada célula através do
collectionView:layout:sizeForItemAtIndexPath:
Ao mudar de retrato para paisagem, gostaria de ajustar o tamanho de cada célula para caber completamente no tamanho de CollectionView, sem deixar espaço de preenchimento entre as células.
Questões:
1) Como alterar o tamanho de uma célula após um evento de rotação?
2) E, melhor ainda, como fazer o layout onde as células sempre cabem no tamanho total da tela?
ios
uicollectionview
uicollectionviewcell
Fmessina
fonte
fonte
sizeForItemAtIndexPath
antes de chamardidRotateFromInterfaceOrientation
. No entanto, para uma exibição de coleção com várias células na tela, invalidar o layout antes da rotação causa um salto desagradável e visível no tamanho antes da rotação da exibição. Nesse caso, acredito que minha resposta ainda é a implementação mais correta.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
qual é exatamente a solução proposta em minha resposta. Se você pudesse incluir minha solução em sua resposta e anotar qual abordagem funciona melhor sob quais condições, isso seria bom o suficiente para mim.Respostas:
1) Você pode manter e trocar vários objetos de layout, mas há uma maneira mais simples. Basta adicionar o seguinte à sua
UICollectionViewController
subclasse e ajustar os tamanhos conforme necessário:A chamada
-performBatchUpdates:completion:
invalidará o layout e redimensionará as células com animação (você pode apenas passar nil para ambos os parâmetros de bloco se não houver ajustes extras para realizar).2) Em vez de codificar os tamanhos dos itens
-collectionView:layout:sizeForItemAtIndexPath
, apenas divida a altura ou largura dos limites do collectionView pelo número de células que você deseja ajustar na tela. Use a altura se sua collectionView rolar horizontalmente ou a largura se rolar verticalmente.fonte
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
irá redesenhar as células com o tamanho correto, mas-performBatchUpdates:completion:
irá animar as alterações, o que parece muito mais agradável IMHO.didRotateFromInterfaceOrientation
obsoleto no iOS 8coordinator.animateAlongsideTransition
nosviewWillTransitionToSize
, e chamandoperformBatchUpdates
dentro do seuanimation
bloco. Isso dá um bom efeito de animação.Se você não quiser animações adicionais
performBatchUpdates:completion:
, basta usarinvalidateLayout
para forçar o recarregamento de collectionViewLayout.fonte
Resolvi usando dois UICollectionViewFlowLayout. Um para retrato e outro para paisagem. Eu os atribuo à minha coleção, ver dinamicamente em -viewDidLoad
Então, simplesmente modifiquei meus métodos collectionViewFlowLayoutDelgate como este
Da última vez, mudo de um layout para outro na rotação
fonte
Há uma maneira simples de definir o tamanho da célula de visualização da coleção:
Não tenho certeza se é animável.
fonte
Swift: célula de visualização de coleção que tem n% da altura da tela
Eu precisava era de uma célula que tivesse uma certa porcentagem da altura das visualizações e fosse redimensionada com a rotação do dispositivo.
Com a ajuda de cima, aqui está a solução
fonte
Se você estiver usando
autolayout
.Você só precisainvalidate layout
em seu controlador de visualização ao girar e ajustaroffset
em sua subclasse de layout de fluxo.Então, em seu controlador de visão -
E no seu
FlowLayout Subclass
fonte
willRotateToInterfaceOrientation
está obsoleto no iOS 8, mas tambémviewWillTransitionToSize
funciona bem para isso.