我有一个 UICollectionView,其框架为
[UIScreen mainScreen].bounds
以及这些属性:
_collectionView.pagingEnabled = YES;
_collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
单元格也具有集合视图的大小。当我旋转时,集合视图的 contentOffset 不适合新方向。它仍然具有与旋转之前相同的偏移量。
为了解决这个问题,我在 didRotate 方法中手动更改了 contentOffset。
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
_collectionView.contentOffset = CGPointMake(_newContentOffsetX, _collectionView.contentOffset.y);
}
这可行,但看起来很糟糕。我也尝试滚动到当前的 IndexPath,但它有同样丑陋的行为:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[_collectionView scrollToItemAtIndexPath:_currentIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
我需要一个干净的过渡和在旋转设备时更新集合视图的内容偏移量的行为。
最好使用
willAnimateRotationToInterfaceOrientation:duration:
当调用此方法时,视图控制器视图的边界已经更新为当前设备方向。似乎这个方法是在旋转动画块内部调用的。这意味着您将在 willAnimateRotationToInterfaceOrientation:duration: 内设置的所有位置都是动画的。
这对我帮助很大,我用它来更新我的视图控制器视图内容插入旋转。效果就像一个魅力! :-)
不要使用
didRotateFromInterfaceOrientation
,而是尝试更新 contentOffset
中的 willRotateToInterfaceOrientation
。
您需要确保使用要旋转到的其他宽度/高度尺寸进行补偿,因为它尚未完成旋转。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
_collectionView.contentOffset = CGPointMake(_newContentOffsetX, _collectionView.contentOffset.y);
}