代码之家  ›  专栏  ›  技术社区  ›  PvDev

如何在ios swift中滚动结束后在选择中心单元格触发didselectitematindexpath?

  •  0
  • PvDev  · 技术社区  · 6 年前

    在这里 向上旋转向下布局 用于旋转木马滚动。从现在起,用户必须点击一个单元格才能触发集合视图didselectitematindexpath。有没有办法在滚动自动结束后选择中心单元格?

    这是我用来旋转的代码:

     let layout = UPCarouselFlowLayout()
        layout.itemSize = CGSize(width: 211, height: 75)
        layout.scrollDirection = .horizontal
        layout.spacingMode = UPCarouselFlowLayoutSpacingMode.fixed(spacing: 10)
        layout.spacingMode = UPCarouselFlowLayoutSpacingMode.overlap(visibleOffset: 65)
        carCollection.collectionViewLayout = layout
    

    这里是用于集合视图的代码:

         func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
    
        return carCategory.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! carCollectionViewCell
    
        cell.carName.text = carCategory[indexPath.row]
        cell.carImage.image = UIImage(named: carCategoryImage[indexPath.row])
        cell.carMeters.text = carCategoryMeter[indexPath.row]
    
        return cell
    
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
            print("selected index::\(indexPath.row)")
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   DonMag    6 年前

    如果你看看 ViewController.swift 从**upcarouselflowlayout**附带的演示中,您将看到 scrollViewDidEndDecelerating 是的。当滚动条停止移动,单元格变为“中心”单元格时触发。

    在那个函数中,变量 currentPage 设置,这就是更改集合视图下面的标签的位置。

    所以,那是 你想干什么就干什么。

    如图所示添加这两行…当滚动停止时,您将创建 IndexPath 手动调用 didSelectItemAt 以下内容:

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let layout = self.collectionView.collectionViewLayout as! UPCarouselFlowLayout
        let pageSide = (layout.scrollDirection == .horizontal) ? self.pageSize.width : self.pageSize.height
        let offset = (layout.scrollDirection == .horizontal) ? scrollView.contentOffset.x : scrollView.contentOffset.y
        currentPage = Int(floor((offset - pageSide / 2) / pageSide) + 1)
    
        // add these two lines      
        let indexPath = IndexPath(item: currentPage, section: 0)
        collectionView(self.collectionView, didSelectItemAt: indexPath)
    }
    

    您几乎肯定会希望添加一些错误检查和附加功能(例如,如果单元格实际发生更改,则只调用didselect,而不只是稍微滑动它,但仍保留在当前单元格上),但这是一个起点。