首页 > 解决方案 > iOS:允许用户交互,但在滚动时禁用 UICollectionView 中其他单元格的选择

问题描述

我已经使用集合视图实现了一个水平菜单。在我选择了一个单元格并滚动浏览 collectionView 的情况下,我希望在滚动结束之前无法选择其他单元格,同时保持先前选择的单元格的选择状态。只需设置allowsSelection = false将取消选择先前选择的单元格。我已经实现了以下方法来检测滚动是否完成:

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    if collectionView.isScrollEnabled {
        isDragging = true
        collectionView.isUserInteractionEnabled = false
    }
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        collectionView.isUserInteractionEnabled = true
    }
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    collectionView.isUserInteractionEnabled = true
}

但是,设置isUserInteractionEnabled = false意味着在我快速滑动的情况下,我不能手动过早停止滚动,这是不希望的。我怎样才能做到这一点?谢谢你。任何帮助表示赞赏。

标签: iosswiftuser-interfaceuicollectionviewhorizontal-scrolling

解决方案


解决方案:

您可以在不启用/禁用用户交互的情况下实现此目的。

  1. isDragging一个全局变量。

    var isDragging: Bool = false

  2. 对方法进行以下更改UIScrollViewDelegate

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
         self.isDragging = true
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
         if !decelerate {
             self.isDragging = true
         }
         else {
             self.isDragging = false
         }
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
         self.isDragging = false
    }
    
  3. UICollectionViewDelegate在'sdidSelectItemAt方法中添加以下逻辑:

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
         if !self.isDragging {
             // Your code related to cell selction here.
         }
    }
    

推荐阅读