UICollectionView drag finger over cells to select them

后端 未结 2 1605
庸人自扰
庸人自扰 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:22

    You could use UIPanGestureRecognizer. And based on the location of the pan events, tracking what cells are passed through. When the gesture ends, you would have an array of selected cells.

    Make sure that cancelsTouchesInView is set to NO. You'll need to set the delegate with gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: and gestureRecognizerShouldBegin implemented to make sure the CollectionView can still scroll

    0 讨论(0)
  • 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
    }
    
    0 讨论(0)
提交回复
热议问题