布局更改后获取屏幕外单元格框架

时间:2015-03-02 20:00:33

标签: ios objective-c uiviewcontroller uikit uicollectionview

我有两个视图控制器。第一个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。似乎没有重新计算单元框架,直到集合视图再次出现在屏幕上,这是一个问题,因为我之前需要它们。有任何想法吗?感谢。

0 个答案:

没有答案