UICollectionView自动滚动到IndexPath的单元格

在加载集合视图之前,用户在集合视图的数组中设置图像的数量。 所有的单元格都不适合在屏幕上。 我有30个单元格,只有6个在屏幕上。

问题:如何在UICollectionView的负载下自动滚动到所需图像的单元格?

新增,编辑答案:

将此添加到viewDidLayoutSubviews

 -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; } 

老的答案适用于较旧的iOS

添加这个viewWillAppear

 [self.view layoutIfNeeded]; [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; 

我发现在viewWillAppear中滚动可能无法可靠地工作,因为集合视图还没有完成它的布局; 您可能会滚动到错误的项目。

我还发现,在viewDidAppear中滚动会导致未滚动视图的瞬间闪烁可见。

而且,如果每次通过viewDidLayoutSubviews滚动,则用户将无法手动滚动,因为每次滚动时,某些集合布局会导致子视图布局。

以下是我发现的可靠工作:

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // If we haven't done the initial scroll, do it once. if (!self.initialScrollDone) { self.initialScrollDone = YES; [self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath atScrollPosition:UICollectionViewScrollPositionRight animated:NO]; } } 

我完全同意上面的答案。 唯一的解决办法是在viewDidAppear中设置代码

 viewDidAppear { [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; } 

当我使用viewWillAppear滚动不起作用。

这似乎为我工作,它类似于另一个答案,但有一些明显的不同:

 - (void)viewDidLayoutSubviews { [self.collectionView layoutIfNeeded]; NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems]; NSIndexPath *currentItem = [visibleItems objectAtIndex:0]; NSIndexPath *nextItem = [NSIndexPath indexPathForItem:someInt inSection:currentItem.section]; [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; } 

迅速:

 your_CollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true) 

Swift 3

 let indexPath = IndexPath(row: itemIndex, section: sectionIndex) collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.right, animated: true) 

滚动位置:

 UICollectionViewScrollPosition.CenteredHorizontally / UICollectionViewScrollPosition.CenteredVertically 

您可以使用GCD将滚动分配到viewDidLoad中的主运行循环的下一个迭代中以实现此行为。 在收集视图显示在屏幕上之前将执行滚动,所以不会闪烁。

 - (void)viewDidLoad { dispatch_async (dispatch_get_main_queue (), ^{ NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH; [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; }); } 

这里的所有答案 – 黑客。 我发现更好的方法滚动集合视图relaodData之后:
子类集合视图布局什么布局你使用,覆盖方法prepareLayout,超级调用后设置什么抵消你需要。
例如: https : //stackoverflow.com/a/34192787/1400119

我build议在collectionView: willDisplay:然后你可以确定集合视图委托提供了一些东西。 这里我的例子:

 func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { /// this is done to set the index on start to 1 to have at index 0 the last image to have a infinity loop if !didScrollToSecondIndex { self.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false) didScrollToSecondIndex = true } }