我有一个集合视图,我试图以编程方式滚动。问题是,如果要滚动到的单元格在集合视图中可见,则不会将其滚动到中心。所以对于下面的图像,下面的单元格是第1项。它不会滚动到它,但它会滚动到项目1到项目2.
我一直在尝试使用UICollectionVieScrollPosition.CenterVertically,但这似乎不起作用。
self.collectionView?.scrollToItem(at: IndexPath(row: 1, section: 0), at: UICollectionViewScrollPosition.centeredVertically, animated: true)
有没有办法绕过这个来强制滚动对集合中心可见的单元格?
答案 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
继承的属性UIScrollView
,scrollToItem(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.estimatedItemSize
和autolayout
来计算单元格的宽度,这就是为什么我遇到这个问题。
那对我来说是因为CollectionView's dynamic sizing
。
回到手动计算宽度后,一切正常。 (通过使用-collectionView:layout:sizeForItemAt:
)