Je suis en train de gérer l'interface de changements d'orientation dans un UICollectionViewController. Ce que je suis en train de réaliser est que je veux avoir le même contentOffset après une interface de rotation. Sens, qu'il devrait être changé correspondant au ratio des limites de changement.
Le démarrage en mode portrait avec le décalage du contenu de {limites.taille.largeur * 2, 0} ...
... devrait se traduire pour le contenu du décalage dans le paysage aussi avec {limites.taille.largeur * 2, 0} (et vice versa).
Le calcul de la nouvelle décalage n'est pas le problème, mais ne sais pas où (ou quand) définir, pour obtenir une animation fluide. Ce que je fais donc le tarif est d'invalider la mise en page en willRotateToInterfaceOrientation:duration:
et de réinitialiser le contenu de décalage en didRotateFromInterfaceOrientation:
:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration;
{
self.scrollPositionBeforeRotation = CGPointMake(self.collectionView.contentOffset.x / self.collectionView.contentSize.width,
self.collectionView.contentOffset.y / self.collectionView.contentSize.height);
[self.collectionView.collectionViewLayout invalidateLayout];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
{
CGPoint newContentOffset = CGPointMake(self.scrollPositionBeforeRotation.x * self.collectionView.contentSize.width,
self.scrollPositionBeforeRotation.y * self.collectionView.contentSize.height);
[self.collectionView newContentOffset animated:YES];
}
Cela modifie le contenu de décalage après la rotation.
Comment puis-je le mettre lors de la rotation? J'ai essayé de définir le nouveau contenu de décalage en willAnimateRotationToInterfaceOrientation:duration:
, mais cela donne un très étrange comportement.
Un exemple peut être trouvé dans mon Projet sur GitHub.