当视图当前不可见时更改集合视图的滚动位置

Posted

技术标签:

【中文标题】当视图当前不可见时更改集合视图的滚动位置【英文标题】:Change scrolling position of collection view, when view is currently not visible 【发布时间】:2015-11-16 14:33:55 【问题描述】:

在两种情况下,我在设置收藏视图的滚动位置时遇到问题:

在启动时我想滚动到某个项目(起始位置!= 集合视图的开头) 视图目前尚不可见,但在“背景”中,集合视图应滚动到某个项目

将集合视图滚动到某个单元格的可靠方法是什么?目前我在viewDidAppear 中使用scrollToItemAtIndexPath 设置滚动位置,但这对我来说太晚了。

【问题讨论】:

你是如何设置滚动位置的?你在使用 scrollToItemAtIndexPath 吗? 你也试过 viewWillAppear 吗? @Mr.T:是的,我使用scrollToItemAtIndexPath。我想我已经尝试过viewWillAppear,但我会再次测试它。我的主要问题是,为什么我不能在创建后的任何时候设置滚动位置? sry,我不明白。滚动位置是什么意思?您可以使用 scrollViewDIdScroll 来更改 scrollView.contentOffset.y ,这是您要找的吗? 在我的收藏视图中有多个单元格。并非所有当前都可见。有时我必须更改位置,以便其他单元格可见。我用scrollToItemAtIndexPath 来滚动到某个单元格(单元格的顺序不同,所以我知道哪个是可见的,哪个不可见)。但是scrollToItemAtIndexPath 并没有做它打算做的事情。它停留在最后一个位置并且不会滚动到新位置,尽管我告诉它这样做。如果我在viewDidAppear 中这样做,那么它确实有效。 【参考方案1】:

尝试调用viewDidLayoutSubview中的方法:

您似乎无法滚动到 viewWillAppear/DidAppear 中的项目!!!!

你可以根据你的收藏视图滚动方向修改UICollectionViewScrollPositionLeft

-(void)viewDidLayoutSubviews

    [super viewDidLayoutSubviews];

    NSIndexPath *indexPath=[NSIndexPath indexPathForItem:3 inSection:0]; //indexpath for the item to scroll

    [_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];


斯威夫特:

    func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    var indexPath: NSIndexPath = NSIndexPath.indexPathForItem(3, inSection: 0)
    collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Left, animated: true)
    

viewDidLayoutSubviews 方法只会被调用一次,并且不会基于集合视图滚动调用!!!

通常它会在viewWillAppear 之后和viewDidAppear 之前被调用!!

【讨论】:

我认为viewDidLayoutSubviews 会被过于频繁地调用(例如在滚动时)。需要一种机制以便只调用一次scrollToItemAtIndexPath。这可以用变量来处理。我正在使用视图控制器包含。如果用户不滚动并且方向没有改变,会调用viewDidLayoutSubviews 吗?现在我正在做一些改变并告诉你结果。 它将在 viewWillAppear 之后和 viewDidAppear 之前被调用。 您可以在任何需要的地方手动调用它,即当您更改 colleciton 视图框架或 colleciton 视图子视图框架时,您应该调用布局子视图。否则,这是一次性调用 将我的代码放入viewDidLayoutSubviews 似乎效果更好,因为用户不太注意滚动。我在我的父视图控制器中使用viewDidLayoutSubviews 方法,该方法将集合视图控制器添加为子视图。所以它不是直接在集合视图控制器的viewDidLayoutSubviews 上。我必须在多个地方进行更改。如果这确实有效,您就会得到勾选。 我不得不添加一些layoutIfNeeded,但现在可以了。【参考方案2】:

试试这个:

CGPoint newContentOffset = yourCollectionView.contentOffset;
float offset = selectedIndex * (self.view.bounds.size.width + cellSpacing);
newContentOffset.x += offset;
yourCollectionView.contentOffset = newContentOffset;

【讨论】:

以上是关于当视图当前不可见时更改集合视图的滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIFT 中更改 ViewController 后保留集合视图滚动位置

当作为子视图添加到集合视图单元格时,滚动视图中的内容不可见

使用绑定时滚动 Xamarin Forms 列表视图

如何从集合视图中的不可见单元格中删除自定义视图

滚动视图与集合视图。获取“可见图像”

将集合视图滚动到顶部