如何将集合视图单元格滚动到可见区域的中间

Posted

技术标签:

【中文标题】如何将集合视图单元格滚动到可见区域的中间【英文标题】:How can I scroll a collection view cell to the middle of the visible area 【发布时间】:2017-01-02 07:49:59 【问题描述】:

我正在使用UICollectionView 创建单行单元格,用作index 以显示包含更多详细信息的表格视图部分。用户可以滚动单元格并通过滚动下面的UITableview 部分来选择显示相应详细信息的特定单元格。这工作正常。我希望一个特定的单元格大致位于可见单元格行的中间,当视图在上一个屏幕的segued 之后首次显示时。在集合视图中是否有与scrollTableTo 相媲美的东西?在How to scroll to a particular index in collection view in swift 中有对scrollToItem 的引用,但我需要帮助了解如何使用它。它在viewDidAppear 中编译和执行。 UITableview 按预期滚动。代码段单元格中的项目 i 是我要显示的项目。但是,单元格不会更改(列表中的第一项显示在左侧)。有效的是shouldSelectAt 中的相同语句。被选中的单元格在可见集中居中。

   override func viewDidAppear(_ animated: Bool) 
    // DOES NOT WORK
    var i = 0
    for workorder in dm.workOrderNames 
        if (workOrderToBeDisplayed == workorder) 
            scrollTableTo(section: i, row: 0)
            print("workorder = \(workorder) i = \(i)")
            return
        
        i = i + 1
    

    workOrderView.scrollToItem(at:IndexPath(item: i, section: 0), at: .centeredHorizontally, animated: false)


func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool 
 // WORKS 
 workOrderView.scrollToItem(at:IndexPath(item: indexPath.item, section: 0), at: .centeredHorizontally, animated: false)
    return true

【问题讨论】:

项目索引(i)是否正确更新?如果是,则在 dispatch async(主线程)中执行 scrollToItem。 视图控制器在主线程上。请参阅编辑后的代码以了解有效的情况。 【参考方案1】:

你可以试试这个

override func viewWillAppear(_ animated: Bool) 
        self.yourCollection.scrollToItem(at: IndexPath(item: collectionSize/2, section: 0), at: .centeredHorizontally, animated: false)
    

【讨论】:

请说明为什么这样做可以更好地为未来的读者服务。谢谢!

以上是关于如何将集合视图单元格滚动到可见区域的中间的主要内容,如果未能解决你的问题,请参考以下文章

启用分页时将水平可滚动集合视图的单元格居中并使其他单元格部分可见

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

滚动和拖动单元格时集合视图抛出异常

在水平滚动中具有不同高度到顶部的集合视图引脚单元格

在集合视图中找到中间单元格并更改其内容

UICollectionView 单元格在可见时不断重新加载