我有两个视图控制器。第一个MainVC包含一个带流布局的UICollectionView,它是UINavigationController的根视图控制器。第二个,DetailVC,被推送到导航堆栈。
流程布局显示网格中的项目,其中itemSize取决于视图控制器的视图大小,因此我在设备旋转时更新itemSize。我这样做(在MainVC中):
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *) _collectionView.collectionViewLayout;
flowLayout.itemSize = [self itemSizeForSize:size]; // method that calculates new item size
[flowLayout invalidateLayout];
}
这是按预期工作的。当我在MainVC中进行旋转时,单元格会相应地调整大小,当我在DetailVC中旋转并向后导航时,单元格已经正确调整大小。
问题是在我弹出DetailVC之前,我需要获取特定单元格的框架(用于自定义过渡),这可能会也可能不会显示。我不能使用-cellForItemAtIndexPath:因为它可能返回nil。所以我使用它(在MainVC中):
- (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC
{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
UICollectionViewLayoutAttributes *attributes = [_collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath:indexPath];
NSLog(@"%@", NSStringFromCGRect(attributes.frame));
但是,如果我在DetailVC中执行了旋转,则始终记录CGRectZero。似乎没有重新计算单元框架,直到集合视图再次出现在屏幕上,这是一个问题,因为我之前需要它们。有任何想法吗?感谢。