有没有办法自动滚动到 UICollectionView 的底部

Posted

技术标签:

【中文标题】有没有办法自动滚动到 UICollectionView 的底部【英文标题】:Is there a way to automatically scroll to the bottom of a UICollectionView 【发布时间】:2013-06-06 07:07:06 【问题描述】:

所以我目前正在开发一个项目,该项目有一个将单元格添加到 UICollectionView 的按钮,然后需要自动滚动到最后一个单元格(即 UICollectionView 的底部)。

我找到了方法 scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated

但现在我在试图找到 CollectionView 中最后一个对象的indexPath 时遇到了困难。

问题似乎在于我一直试图将 UICollectionView 中的单元格视为一个数组(无法枚举它们,不响应lastObject 等等)。我似乎能得到的最接近的是方法visibleItems,它确实给了我一个数组,但当我需要添加到可见框架之外的单元格时没有帮助。

有没有办法获取 CollectionView 中最后一个对象的 IndexPath?

【问题讨论】:

你的数据源是什么?如何获取数据源的计数以确定最后的索引路径? 【参考方案1】:

你可以问你的数据源:

NSInteger section = [self numberOfSectionsInCollectionView:self.collectionView] - 1;
NSInteger item = [self collectionView:self.collectionView numberOfItemsInSection:section] - 1;
NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section];

【讨论】:

就是这样!谢谢!我想我一直忽略 indexPath 的 section 部分,所以它看起来像 [15] 而不是这给我的 [0, 15]。 另请注意,滚动位置UICollectionViewScrollPositionBottom 将滚动直到单元格可见。如果你想一直滚动到集合视图的底部,包括底部插图,请使用UICollectionViewScrollPositionTop【参考方案2】:

这是您的答案...如果您不想想询问数据源。

将其添加到您的 viewDidAppear: 方法中。

NSInteger section = [_collectionView numberOfSections] - 1 ;
NSInteger item = [_collectionView numberOfItemsInSection:section] - 1 ;
NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section] ;
[_collectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:(UICollectionViewScrollPositionBottom) animated:YES];

【讨论】:

【参考方案3】:

Swift 3 & 4,假设你只有一个部分:

func scrollToBottom() 
    let section = 0
    let item = collectionView.numberOfItems(inSection: section) - 1
    let lastIndexPath = IndexPath(item: item, section: section)
    collectionView.scrollToItem(at: lastIndexPath, at: .bottom, animated: false)

【讨论】:

我猜你可以避免多余的2个变量lastIndex path和item,直接在scrollToItem方法中创建indexpath【参考方案4】:

我遇到了一个问题,我可以滚动到集合视图中的 最后一个 项,但无法滚动到 页脚

以下代码修复了该问题:

let bottomOffset = CGPoint(x: 0, 
                           y: collectionView.frame.height + (collectionView.contentSize.height * CGFloat(itemsInCollectionView.count)))
collectionView.setContentOffset(bottomOffset, animated: false)

【讨论】:

【参考方案5】:

我会先检查是否有滚动到底部的选项,以防万一您的数据出现问题并且您的表/集合视图没有行。

func scrollToBottomIfPossible() 

    guard self.myRows.count > 0 else 
            return
    

    self.collectionView.scrollToItem(at: IndexPath(row: yourItems.count - 1, section: mySections.count), at: .bottom, animated: true)

【讨论】:

以上是关于有没有办法自动滚动到 UICollectionView 的底部的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法防止 Xamarin Forms 滚动视图在打开选择器控件时自动滚动到最后编辑的条目?

UICollectionView 中的图像在向下滚动时会自动翻转?

有没有办法防止 ScrollView 在 TextView 获得焦点时自动滚动?

有没有办法在结合页面控制的滚动视图中自动布局图像?

AJAX 聊天,自动滚动窗口

如何在颤动中自动滚动文本?