我有一个我用来显示我的入门画面的collectionView。每个单元格占据视图的整个宽度和高度,目前我可以在每个单元格(页面)之间进行精细滑动。
我必须实现下一个按钮。此按钮将在每次单击时将collectionView移动1个索引(直到结束)。我只是想让它立即行动,即使有一些类似的问题,我还没有能够提出解决方案。
这就是我试过的
@IBAction func nextPageButtonClicked(_ sender: AnyObject) {
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
let currentItem: NSIndexPath = visibleItems.object(at: 0) as! NSIndexPath
let nextItem: NSIndexPath = NSIndexPath(row: currentItem + 1, section: 0)
self.collectionView.scrollToItem(at: nextItem as IndexPath, at: .left, animated: true)
}
我在第4行(currentItem + 1)上执行二元运算符时遇到错误,但即使我对数字进行硬编码并尝试运行它,我仍然没有得到滚动功能
答案 0 :(得分:10)
您正在尝试增加indexPath,您必须增加indexPath的行。
let nextItem = NSIndexPath(row: currentItem.row + 1, section: 0)
实施例
@IBAction func nextPageButtonClicked(_ sender: AnyObject) {
guard let indexPath = collectionView.indexPathsForVisibleItems.first.flatMap({
IndexPath(item: $0.row + 1, section: $0.section)
}), collectionView.cellForItem(at: indexPath) != nil else {
return
}
collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
}
答案 1 :(得分:1)
@IBAction func showNextItemCollectionViewOnClick(_ sender: Any) {
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
var minItem: NSIndexPath = visibleItems.object(at: 0) as! NSIndexPath
for itr in visibleItems {
if minItem.row > (itr as AnyObject).row {
minItem = itr as! NSIndexPath
}
}
let nextItem = NSIndexPath(row: minItem.row + 1, section: 0)
self.collectionView.scrollToItem(at: nextItem as IndexPath, at: .left, animated: true)
}
步骤:
注意:即使集合视图中存在多个项目,也可以使用此功能。点击按钮,如果我们想要多个项目的移动将“1”更改为所需的值,我们希望“一个”更多的项目可见。
答案 2 :(得分:1)
尝试使用这些方法左右以及收集单元格的正确增量
正确增量
@IBAction func Btn_RightAction(_ sender: Any)
{
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
let currentItem: IndexPath = visibleItems.object(at: 0) as! IndexPath
let nextItem: IndexPath = IndexPath(item: currentItem.item + 1, section: 0)
if nextItem.row < ImgArr.count {
self.collectionView.scrollToItem(at: nextItem, at: .left, animated: true)
}
}
左侧增量
@IBAction func Btn_LeftAction(_ sender: Any)
{
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
let currentItem: IndexPath = visibleItems.object(at: 0) as! IndexPath
let nextItem: IndexPath = IndexPath(item: currentItem.item - 1, section: 0)
if nextItem.row < ImgArr.count && nextItem.row >= 0{
self.collectionView.scrollToItem(at: nextItem, at: .right, animated: true)
}
}
答案 3 :(得分:1)
ios 14上的collectionView.scrollToItem函数存在问题,因此您可以尝试
extension UICollectionView {
func scrollToNextItem() {
let contentOffset = CGFloat(floor(self.contentOffset.x + self.bounds.size.width))
self.moveToFrame(contentOffset: contentOffset)
}
func moveToFrame(contentOffset : CGFloat) {
self.setContentOffset(CGPoint(x: contentOffset, y: self.contentOffset.y), animated: true)
}
}
这是您的按钮操作
@IBAction func nextButtonAct(_ sender: Any) {
collectionView.scrollToNextItem()
}
答案 4 :(得分:0)
对于 didTapBack ,您只需要当前页面,但在 didTapForward 中,您还需要检查 currentPage ,如果它没有到达索引的最后一个索引 yourArray
if currentPage > self.yourArray.count - 2 { return }
确保没有到达最后一个索引
@IBAction func didTapBack(_ sender: Any) { let indexPath = IndexPath(item: currentPage - 1, section: 0) collectionView.scrollToItem(at: indexPath, at: .left, animated: true) } @IBAction func didTapForward(_ sender: Any) { if currentPage > self.yourArray.count - 2 { return } let indexPath = IndexPath(item: currentPage + 1, section: 0) collectionView.scrollToItem(at: indexPath, at: .right, animated: true) }