UICollectionView drag finger over cells to select them

后端 未结 2 1604
庸人自扰
庸人自扰 2020-12-28 12:04

Using UICollectionView, is it possible to select multiple cells by dragging your finger over a few of them? E.g., if you drag your finger over a row of 6, and d

2条回答
  •  被撕碎了的回忆
    2020-12-28 12:29

    Swift 3: Swipe to select with auto scrolling and working scroll.

    var selectMode = false
    var lastSelectedCell = IndexPath()
    
    func setupCollectionView() {
        collectionView.canCancelContentTouches = false
        collectionView.allowsMultipleSelection = true
        let longpressGesture = UILongPressGestureRecognizer(target: self, action: #selector(didLongpress))
        longpressGesture.minimumPressDuration = 0.15
        longpressGesture.delaysTouchesBegan = true
        longpressGesture.delegate = self
        collectionView.addGestureRecognizer(longpressGesture)
    
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didPan(toSelectCells:)))
        panGesture.delegate = self
        collectionView.addGestureRecognizer(panGesture)
    }
    
    func selectCell(_ indexPath: IndexPath, selected: Bool) {
        if let cell = collectionView.cellForItem(at: indexPath) {
            if cell.isSelected {
                collectionView.deselectItem(at: indexPath, animated: true)
                collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.centeredVertically, animated: true)
            } else {
                collectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.centeredVertically)
            }
            if let numberOfSelections = collectionView.indexPathsForSelectedItems?.count {
                title = "\(numberOfSelections) items selected"
            }
        }
    }
    
    func didPan(toSelectCells panGesture: UIPanGestureRecognizer) {
        if !selectMode {
            collectionView?.isScrollEnabled = true
            return
        } else {
            if panGesture.state == .began {
                collectionView?.isUserInteractionEnabled = false
                collectionView?.isScrollEnabled = false
            }
            else if panGesture.state == .changed {
                let location: CGPoint = panGesture.location(in: collectionView)
                if let indexPath: IndexPath = collectionView?.indexPathForItem(at: location) {
                    if indexPath != lastSelectedCell {
                        self.selectCell(indexPath, selected: true)
                        lastSelectedCell = indexPath
                    }
                }
            } else if panGesture.state == .ended {
                collectionView?.isScrollEnabled = true
                collectionView?.isUserInteractionEnabled = true
                swipeSelect = false
            }
        }
    }
    
    func didLongpress() {
        swipeSelect = true
    }
    

提交回复
热议问题