单击按钮时移动 collectionView(Swift)

问题描述 投票:0回答:7

我有一个

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) 上执行二元运算符时遇到错误,但即使我对数字进行硬编码并尝试运行它,我仍然无法使滚动发挥作用

ios swift uicollectionview
7个回答
21
投票

尝试这些方法来增加集合单元格的左侧和右侧

对于右增量

@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)

    }
}

13
投票

您正在尝试增加索引路径,则必须增加索引路径的行。

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)
}

3
投票
@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. 转到下一个项目
  4. 滚动到所需项目。

注意:即使集合视图中存在多个项目并且单击按钮时,如果我们希望移动多个项目将“1”更改为所需值,我们希望多“一个”项目可见,这也适用。


3
投票

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()
}

2
投票

对于我在 ios 14 中使用的情况,上述解决方案无法正常工作。所以在这里 是解决方案。

extension UICollectionView {

 func scrollToNextItem() {
    let contentOffset = CGFloat(floor(self.contentOffset.x + 
    self.bounds.size.width))
    self.moveToFrame(contentOffset: contentOffset)
}

func scrollToPreviousItem() {
    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)
}}

用途:

func rightButtonTapped() {
    infoCollectionView.scrollToNextItem()
}

func leftButtonTapped() {
    infoCollectionView.scrollToPreviousItem()
}

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)
}

0
投票

这是单击按钮时滚动集合视图的解决方案。

注意: sender.tag 用于处理左右滚动。

let visibleItems = collecitonView.indexPathsForVisibleItems.sorted { $0 < $1 }

guard let indexPath = sender.tag == 0 ? visibleItems.first : visibleItems.last else {
            return
        }
        
let nextItem: IndexPath = IndexPath(item: sender.tag == 0  ? indexPath.item - 1 : indexPath.item + 1, section: 0)
        
if nextItem.row < 10 && nextItem.row >= 0{
            
            collecitonView.scrollToItem(at: nextItem, at: .centeredHorizontally, animated: true)
        }
© www.soinside.com 2019 - 2024. All rights reserved.