ScrollToItem 无法正常工作
ScrollToItem isn't working properly
我有一个按钮的水平集合视图。单击其中一个时,用户将被带到另一个视图控制器。通常并非所有按钮都可见,所以我希望所选按钮位于集合视图的最左侧。
我试图用 scrollToItem 函数来做到这一点。问题是,它每次都会一直向右滚动集合视图。
相关代码:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return labelArray.count
}
//frees up the collection view when the scroll is active
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
isScrolling = true
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
//possible problem
if isScrolling == false {
collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false)
}
let myLabel = cell.viewWithTag(1) as! UILabel
let myArray = labelArray[indexPath.row]
myLabel.text = labelArray[indexPath.row]
myLabel.textColor = UIColor.white
if myArray == labelArray[1] {
cell.backgroundColor = UIColor.black
} else {
cell.backgroundColor = UIColor(red: 56/255, green: 120/255, blue: 195/255, alpha: 1)
}
return cell
}
如有任何帮助,我们将不胜感激。
您正在调用 cellForItemAt 方法中的 scrollToItem 方法,该方法会为集合视图中的每个可见单元格调用。所以你实际上是在尝试滚动到每个单元格,因为它变得可见。尝试在 didSelectItemAt 方法中调用 scrollToItem 方法,如下所示:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
}
didSelectItemAt 仅在选择单元格时调用,并提供所选单元格的 IndexPath。
我让它工作了。我所做的只是改变
if isScrolling == false {
collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false)
}
至
if isScrolling == false {
let i = IndexPath(item: 1, section: 0)
collectionView.scrollToItem(at: i, at: .right, animated: false)
}
以前它会滚动到每个单元格而不会在每个单独的单元格处停止。
因此,对于每个项目,我都会根据所选部分对值进行硬编码。
我有一个按钮的水平集合视图。单击其中一个时,用户将被带到另一个视图控制器。通常并非所有按钮都可见,所以我希望所选按钮位于集合视图的最左侧。
我试图用 scrollToItem 函数来做到这一点。问题是,它每次都会一直向右滚动集合视图。
相关代码:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return labelArray.count
}
//frees up the collection view when the scroll is active
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
isScrolling = true
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
//possible problem
if isScrolling == false {
collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false)
}
let myLabel = cell.viewWithTag(1) as! UILabel
let myArray = labelArray[indexPath.row]
myLabel.text = labelArray[indexPath.row]
myLabel.textColor = UIColor.white
if myArray == labelArray[1] {
cell.backgroundColor = UIColor.black
} else {
cell.backgroundColor = UIColor(red: 56/255, green: 120/255, blue: 195/255, alpha: 1)
}
return cell
}
如有任何帮助,我们将不胜感激。
您正在调用 cellForItemAt 方法中的 scrollToItem 方法,该方法会为集合视图中的每个可见单元格调用。所以你实际上是在尝试滚动到每个单元格,因为它变得可见。尝试在 didSelectItemAt 方法中调用 scrollToItem 方法,如下所示:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
}
didSelectItemAt 仅在选择单元格时调用,并提供所选单元格的 IndexPath。
我让它工作了。我所做的只是改变
if isScrolling == false {
collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false)
}
至
if isScrolling == false {
let i = IndexPath(item: 1, section: 0)
collectionView.scrollToItem(at: i, at: .right, animated: false)
}
以前它会滚动到每个单元格而不会在每个单独的单元格处停止。
因此,对于每个项目,我都会根据所选部分对值进行硬编码。