UICollectionViewScrollPosition不起作用

时间:2017-01-01 03:55:57

标签: ios swift uicollectionview

我有一个集合视图,我试图以编程方式滚动。问题是,如果要滚动到的单元格在集合视图中可见,则不会将其滚动到中心。所以对于下面的图像,下面的单元格是第1项。它不会滚动到它,但它会滚动到项目1到项目2.

我一直在尝试使用UICollectionVieScrollPosition.CenterVertically,但这似乎不起作用。

self.collectionView?.scrollToItem(at: IndexPath(row: 1, section: 0), at: UICollectionViewScrollPosition.centeredVertically, animated: true)

有没有办法绕过这个来强制滚动对集合中心可见的单元格?

enter image description here

5 个答案:

答案 0 :(得分:9)

我发现这样做的最好方法是不使用scrollToItem,而是获取索引的CGRect,然后使其可见。

     let rect = self.collectionView.layoutAttributesForItem(at: IndexPath(row: 5, section: 0))?.frame
     self.collectionView.scrollRectToVisible(rect!, animated: false)

答案 1 :(得分:0)

首先,您需要找到 CollectionView 的中心,这就是它的完成方式:

private func findCenterIndex() -> Int {
        let center = self.view.convert(numberCollectionView.center, to: self.numberCollectionView)
        let row = numberCollectionView!.indexPathForItem(at: center)?.row


        guard let index = row else {

            return 0
        }


        return index
    }

然后获取scrollToItem下的行号,它应该有效:

collectionView.scrollToItem(at: IndexPath(item: findCenterIndex(), section: 0), at: .centeredVertically, animated: false)

viewDidLayoutSubviews()

调用它

答案 2 :(得分:0)

如果itemSize太小,scrollToItem无效。 siwft collectionView.contentOffset = offset 我用这个固定的

答案 3 :(得分:0)

您似乎已将UICollectionView中的第一个单元格垂直居中。

我发现如果我通过contentInset UICollectionView属性的scrollToItem(at:at:animated:)添加插入来居中第一个单元格,则其sectionInset方法对于已经可见的单元格也不起作用

但是,如果我通过在UICollectionViewFlowLayout的{​​{1}}属性中添加插入内置第一个单元格,则scrollToItem(at:at:animated:)适用于可见单元格。

具体来说,在代码中:

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()

    // Padding needed to allow the first and last cells to be centred vertically.
    let insectHeight = (collectionView.bounds.height - collectionViewFlowLayout.itemSize.height) / 2.0

    // This way is disabled because scrollToItem doesn't work for visible cells.
    // collectionView.contentInset = UIEdgeInsets(top:    insectHeight,
    //                                            left:   0,
    //                                            bottom: insectHeight,
    //                                            right:  0)

    // This is the way for scrollToItem to work for visible cells.
    collectionViewFlowLayout.sectionInset = UIEdgeInsets(top:    insectHeight,
                                                         left:   0,
                                                         bottom: insectHeight,
                                                         right:  0)

}

我的猜测是contentInset是从UICollectionView继承的属性UIScrollViewscrollToItem(at:at:animated:)计算偏移的方式似乎与contentInset的方式不兼容由UIScrollView使用。

答案 4 :(得分:0)

我正尝试将其延迟0.1秒。就我而言,目前看来不错:

collectionView.collectionViewLayout.invalidateLayout() //just in case, iOS10 may crash btw.

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    self.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
}

更新

好的,事实证明我正在使用layout.estimatedItemSizeautolayout来计算单元格的宽度,这就是为什么我遇到这个问题。 那对我来说是因为CollectionView's dynamic sizing。 回到手动计算宽度后,一切正常。 (通过使用-collectionView:layout:sizeForItemAt: