UICollectionView scrollToItemAtIndexPath:并获取新的单元格位置

时间:2014-02-27 15:42:18

标签: ios objective-c scroll uicollectionview uicollectionviewcell

我想将集合视图滚动到一些没有动画的屏幕外单元格,并在滚动后获取该单元格的位置。问题是集合视图正确(可视)滚动但单元格框架仍然在屏幕外。这是我的代码:

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)会在屏幕上返回正确的单元格框架。

3 个答案:

答案 0 :(得分:3)

正如我从您的问题陈述中可以理解的那样,您希望将视图外的某个单元格设置为可见状态。

当UICollectionView计算

时,单元格放置在相同位置
  • (无效)prepareLayout
  • (void)layoutAttributes .. methods。

收集单元格的框架是固定的,直到调用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];