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 } }