Я пытаюсь обрабатывать изменения ориентации интерфейса в UICollectionViewController. То, что я пытаюсь достичь, заключается в том, что я хочу иметь тот же контент, что и после поворота интерфейса. Это означает, что он должен быть изменен в соответствии с отношением изменений границ.
Начиная с портрета с смещением содержимого {bounds.size.width * 2, 0}...
... должно приводить к смещению содержимого в ландшафте также с помощью {bounds.size.width * 2, 0} (и наоборот).
Вычисление нового смещения не является проблемой, но не знает, где (или когда) установить его, чтобы получить гладкую анимацию. То, что я делаю так, - это недействительность макета в willRotateToInterfaceOrientation:duration:
и сброс смещения содержимого в 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];
}
Это изменение смещения содержимого после вращения.
Как я могу установить его во время вращения? Я попытался установить новое смещение содержимого в willAnimateRotationToInterfaceOrientation:duration:
, но это приводит к очень странному поведению.
Пример можно найти в моем проекте на GitHub.