iOS 7: mantendo os itens exibidos na área de visualização após a rotação do UICollectionView
Estou usando umUICollectionView
com rolagem horizontal (Layout =UICollectionViewFlowLayout
) Após a rotação, adapto o deslocamento do conteúdo para que os mesmos itens sejam exibidos antes da rotação. Na rotação, a largura dos itens é alterada, porque sempre existem sete itens na tela. Minha abordagem atual funciona no iOS 8, mas não no iOS 7.
No iOS 7layoutAttributesForItemAtIndexPath
sempre retorna a mesma posição X, independentemente da orientação. Portanto, parece que algum quadro não está corretamente adaptado. O cálculo do tamanho dos itens parece estar correto, porque eles são alterados de acordo.
Este é o meu código:
Meu controlador de exibição principal:
public override void DidRotate (UIInterfaceOrientation fromInterfaceOrientation)
{
base.DidRotate (fromInterfaceOrientation);
myProblematicCollectionView.invalidateLayout ();
}
O método da exibição de coleção:
public void invalidateLayout(){
Layout.InvalidateLayout ();
UICollectionViewLayoutAttributes layoutAttributesForItem = CollectionView.GetLayoutAttributesForItem (NSIndexPath.FromItemSection (0, CurrentVisibleSection));
CollectionView.SetContentOffset (new CGPoint (layoutAttributesForItem.Frame.X, 0), false);
}
O código está em C #, mas não deve incomodá-lo. Você pode usar soluções de correções em Objective-C ou Swift.
CurrentVisibleSection é a seção com os sete itens. Está sempre atualizado. QuandoGetLayoutAttributesForItem
oulayoutAttributesForItemAtIndexPath
é chamado, oGetSizeForItem
oucollectionView:layout:sizeForItemAtIndexPath:
é chamado antes que o deslocamento do conteúdo seja definido.
Alguém tem uma idéia de por que sempre recebo o mesmo atributo de layout, independentemente da orientação?
Editar:
Se eu usarreloadData
antes de ligarlayoutAttributesForItemAtIndexPath
Eu recebo o tamanho correto. Preciso disso depoisinvalidateLayout
?
O que também não entendo é que a exibição da coleção tem o tamanho correto (a largura do quadro está correta).