按钮单击(快速)移动集合视图

时间:2016-09-26 01:15:23

标签: ios swift uicollectionview

我有一个我用来显示我的入门画面的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)上执行二元运算符时遇到错误,但即使我对数字进行硬编码并尝试运行它,我仍然没有得到滚动功能

5 个答案:

答案 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. 查找“visibleItems”变量中的所有可见项目
  2. 查找可见项目中的最小项目
  3. 转到nextItem
  4. 滚动到所需的项目。
  5. 注意:即使集合视图中存在多个项目,也可以使用此功能。点击按钮,如果我们想要多个项目的移动将“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)
}