You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为VegaScroll的CollectionCell添加左滑删除功能?

Adding Swipe-to-Delete to VegaScroll UICollectionView Cells (XIB-Based)

Got it, I’ve worked with VegaScroll before and adding swipe-to-delete can be a bit tricky because of its custom scroll behavior—let’s break this down step by step, especially since you’re using XIB-based cells. VegaScroll doesn’t include built-in swipe actions, so we’ll implement this manually while avoiding conflicts with its scrolling gestures.

Step 1: Prepare Your XIB Cell Layout

Open your collection cell XIB and adjust the layout to support swipe actions:

  • Add a main content view that holds all your existing cell UI (this is the view users will swipe left on)
  • Add a delete container view behind the main content view—set its width to match the cell, add a red background, and align a delete button/trash icon to its right edge
  • Ensure the main content view fills the entire cell frame, so it slides over the delete container smoothly

In your custom cell class (e.g., VegaSwipeCell), add IBOutlets and setup code:

class VegaSwipeCell: UICollectionViewCell {
    @IBOutlet weak var mainContentView: UIView!
    @IBOutlet weak var deleteButton: UIButton!
    @IBOutlet weak var deleteContainerView: UIView!
    
    var deleteTapped: (() -> Void)?
    private var isSwipedOpen = false

    override func awakeFromNib() {
        super.awakeFromNib()
        setupSwipeGesture()
        deleteButton.addTarget(self, action: #selector(handleDeleteTap), for: .touchUpInside)
    }

    @objc private func handleDeleteTap() {
        deleteTapped?()
    }
}

Step 2: Add Pan Gesture & Swipe Logic

Add a pan gesture recognizer to the main content view, and handle horizontal swipes while ignoring vertical movement (to avoid conflicting with VegaScroll’s vertical scroll):

private func setupSwipeGesture() {
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
    panGesture.delegate = self
    mainContentView.addGestureRecognizer(panGesture)
}

@objc private func handlePanGesture(_ gesture: UIPanGestureRecognizer) {
    let translation = gesture.translation(in: self)
    
    // Only respond to horizontal swipes
    guard abs(translation.x) > abs(translation.y) else { return }
    
    switch gesture.state {
    case .began, .changed:
        // Limit swipe distance to the width of the delete container
        let maxSwipe = -deleteContainerView.frame.width
        let newX = max(translation.x, maxSwipe)
        mainContentView.transform = CGAffineTransform(translationX: newX, y: 0)
    case .ended, .cancelled:
        // Decide whether to open or close the swipe based on swipe distance
        let shouldOpen = translation.x < -deleteContainerView.frame.width / 2
        let finalX: CGFloat = shouldOpen ? -deleteContainerView.frame.width : 0
        
        UIView.animate(withDuration: 0.3) {
            self.mainContentView.transform = CGAffineTransform(translationX: finalX, y: 0)
        }
        isSwipedOpen = shouldOpen
    default:
        break
    }
}

Step 3: Resolve Gesture Conflicts with VegaScroll

Implement the UIGestureRecognizerDelegate to let our pan gesture work alongside VegaScroll’s scroll gesture:

extension VegaSwipeCell: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        // Allow simultaneous recognition only if the other gesture is Vega's scroll gesture
        return otherGestureRecognizer is UIScrollViewPanGestureRecognizer
    }
    
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        guard let pan = gestureRecognizer as? UIPanGestureRecognizer else { return true }
        let velocity = pan.velocity(in: self)
        // Only start our gesture if it's a horizontal swipe
        return abs(velocity.x) > abs(velocity.y)
    }
}

Step 4: Handle Deletion in Your View Controller

In the view controller hosting your VegaScroll collection view:

  1. Configure the cell’s delete action to update your data source and collection view:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "VegaSwipeCell", for: indexPath) as! VegaSwipeCell
    
    // Configure your cell content here
    
    cell.deleteTapped = { [weak self] in
        guard let self = self else { return }
        // Remove item from data source
        self.items.remove(at: indexPath.item)
        // Animate deletion properly
        collectionView.performBatchUpdates({
            collectionView.deleteItems(at: [indexPath])
        }, completion: { _ in
            self.closeAllOpenSwipedCells()
        })
    }
    
    return cell
}
  1. Add a helper to close any open swiped cells when scrolling or after deletion:
private func closeAllOpenSwipedCells() {
    guard let visibleCells = collectionView.visibleCells as? [VegaSwipeCell] else { return }
    for cell in visibleCells where cell.isSwipedOpen {
        UIView.animate(withDuration: 0.3) {
            cell.mainContentView.transform = .identity
        }
        cell.isSwipedOpen = false
    }
}
  1. Trigger this helper when scrolling starts to prevent open cells from staying visible:
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    closeAllOpenSwipedCells()
}

Troubleshooting Tips

  • If swipes aren’t registering: Double-check that the pan gesture is attached to the mainContentView (not the cell itself) and that the delegate methods are correctly filtering for horizontal movement.
  • If VegaScroll feels janky: Tweak the shouldRecognizeSimultaneouslyWith logic to only allow simultaneous gestures when the swipe is clearly horizontal.
  • If deletion breaks layout: Always use performBatchUpdates when deleting items—VegaScroll relies on proper collection view updates to maintain its custom layout.

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:37:35