Search code examples
iosobjective-cuicollectionview

Long press gesture on UICollectionViewCell


I was wondering how to add a long press gesture recognizer to a (subclass of) UICollectionView. I read in the documentation that it is added by default, but I can't figure out how.

What I want to do is: Long press on a cell ( I have a calendar thingy from github ), get which cell is tapped and then do stuff with it. I need to know what cell is longpressed. Sorry for this broad question, but i couldn't find anything better on either google or SO


Solution

  • Objective-C

    In your myCollectionViewController.h file add the UIGestureRecognizerDelegate protocol

    @interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
    

    in your myCollectionViewController.m file:

    - (void)viewDidLoad
    {
        // attach long press gesture to collectionView
        UILongPressGestureRecognizer *lpgr 
           = [[UILongPressGestureRecognizer alloc]
                         initWithTarget:self action:@selector(handleLongPress:)];
        lpgr.delegate = self;
        lpgr.delaysTouchesBegan = YES;
        [self.collectionView addGestureRecognizer:lpgr];
    }
    
    -(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
    {
        if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
            return;
        }
        CGPoint p = [gestureRecognizer locationInView:self.collectionView];
    
        NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
        if (indexPath == nil){
            NSLog(@"couldn't find index path");            
        } else {
            // get the cell at indexPath (the one you long pressed)
            UICollectionViewCell* cell =
            [self.collectionView cellForItemAtIndexPath:indexPath];
            // do stuff with the cell
        }
    }
    

    Swift

    class Some {
    
        @objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
            if gesture.state != .Ended {
                return
            }
            let p = gesture.locationInView(self.collectionView)
    
            if let indexPath = self.collectionView.indexPathForItemAtPoint(p) {
                // get the cell at indexPath (the one you long pressed)
                let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
                // do stuff with the cell
            } else {
                print("couldn't find index path")
            }
        }
    }
    
    let some = Some()
    let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
    

    Swift 4

    class Some {
    
        @objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
            if gesture.state != .ended { 
                return 
            } 
    
            let p = gesture.location(in: self.collectionView) 
    
            if let indexPath = self.collectionView.indexPathForItem(at: p) { 
                // get the cell at indexPath (the one you long pressed) 
                let cell = self.collectionView.cellForItem(at: indexPath) 
                // do stuff with the cell 
            } else { 
                print("couldn't find index path") 
            }
        }
    }
    
    let some = Some()
    let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))