我想将集合视图滚动到一些没有动画的屏幕外单元格,并在滚动后获取该单元格的位置。问题是集合视图正确(可视)滚动但单元格框架仍然在屏幕外。这是我的代码:
NSIndexPath *path = [fetchedResultsController indexPathForObject:objectInCollection];
[collectionView scrollToItemAtIndexPath:path atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
[collectionView layoutSubviews]; // or 'layoutIfNeeded', doesn't matter
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:path];
cellFrame = [cell.superview convertRect:cell.frame toView:nil]; // still not refreshed
我可以建议集合视图不立即应用滚动,所以我想找到应用滚动的方法。
---更新---
集合视图位于以前的视图控制器中(因此我从代码中滚动它,然后弹出可见的视图控制器)。
即使在前一个视图控制器的viewDidAppear:
方法中,单元格框仍保持屏外。确切地说,[cell.superview convertRect:cell.frame toView:nil];
返回没有contentOffset
集合视图的帧。因此CGRectOffset([cell.superview convertRect:cell.frame toView:nil], 0, -collectionView.contentOffset.y)
会在屏幕上返回正确的单元格框架。
答案 0 :(得分:3)
正如我从您的问题陈述中可以理解的那样,您希望将视图外的某个单元格设置为可见状态。
当UICollectionView计算
时,单元格放置在相同位置收集单元格的框架是固定的,直到调用invalidateLayout或reloaddata。只需要处理集合视图的contentOffset。 只需获取单元格框架并设置contentOffset,即可在屏幕上看到您的单元格框架。希望它有所帮助。
答案 1 :(得分:0)
单元格框架应该是正确的,我认为你根本不需要使用convertRect。
cellFrame = cell.frame;
但是,您可能必须在加载集合视图后执行此操作。首先调用[collectionView reloadData]。
还有一个layoutAttributesForItemAtIndexPath:方法,该方法具有该单元格的属性。您可以在indexPath上调用它并以这种方式获取属性。
答案 2 :(得分:0)
尝试将滚动位置更改为 UICollectionViewScrollPositionBottom ,这对我有用 -
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:NO];