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

vfhzx4xs  于 2022-12-21  发布在  Swift
关注(0)|答案(6)|浏览(159)

我有一个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)执行二元运算符时出现错误,但即使我硬编码数字并尝试运行它,滚动条仍然无法正常工作

pkmbmrz7

pkmbmrz71#

请尝试这些方法来向左和向右递增集合单元格

对于右增量

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

    }
}
zc0qhyus

zc0qhyus2#

您正在尝试递增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)
}
m1m5dgzv

m1m5dgzv3#

@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"变量中的所有可见项目
1.查找可见项目中存在的最小项目
1.转到下一个项目
1.滚动至所需项目。
注:即使在集合视图中存在多个项目的情况下,此操作也有效,如果我们希望移动多个项目,则单击按钮时,我们希望多"一个"项目可见,将"1"更改为所需值。

wrrgggsh

wrrgggsh4#

iOS14上的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()
}
4urapxun

4urapxun5#

对于didTapBack,您只需要当前页,但在didTapForward中,如果currentPage未到达yourArray的最后一个索引,则还需要检查currentPage

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

tvz2xvvm6#

对于我使用的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()
}

相关问题