Long press gesture on UICollectionViewCell

前端 未结 8 1071
猫巷女王i
猫巷女王i 2020-11-27 09:46

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

8条回答
  •  伪装坚强ぢ
    2020-11-27 10:24

    To have an external gesture recognizer and do not conflict with internal gesture recognizers on the UICollectionView you need to:

    Add your gesture recognizer, set up it and capture a reference for it somewhere (the best option is on your subclass if you subclassed UICollectionView)

    @interface UICollectionViewSubclass : UICollectionView     
    
    @property (strong, nonatomic, readonly) UILongPressGestureRecognizer *longPressGestureRecognizer;   
    
    @end
    

    Override default initialization methods initWithFrame:collectionViewLayout: and initWithCoder: and add set up method for you long press gesture recognizer

    @implementation UICollectionViewSubclass
    
    -(instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout
    {
        if (self = [super initWithFrame:frame collectionViewLayout:layout]) {
            [self setupLongPressGestureRecognizer];
        }
        return self;
    }
    
    -(instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super initWithCoder:aDecoder]) {
            [self setupLongPressGestureRecognizer];
        }
        return self;
    }
    
    @end
    

    Write your setup method so it instantiates long press gesture recognizer, set it's delegate, setup dependencies with UICollectionView gesture recognizer (so it be the main gesture and all other gestures will wait till that gesture fails before being recognized) and add gesture to the view

    -(void)setupLongPressGestureRecognizer
    {
        _longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                                                    action:@selector(handleLongPressGesture:)];
        _longPressGestureRecognizer.delegate = self;
    
        for (UIGestureRecognizer *gestureRecognizer in self.collectionView.gestureRecognizers) {
            if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
                [gestureRecognizer requireGestureRecognizerToFail:_longPressGestureRecognizer];
            }
        }
    
        [self.collectionView addGestureRecognizer:_longPressGestureRecognizer];
    }
    

    Also don't forget to implement UIGestureRecognizerDelegate methods that fails that gesture and allow simultaneous recognition (you may or may don't need to implement it, it depends on other gesture recognizers you have or dependencies with internal gesture recognizers)

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        if ([self.longPressGestureRecognizer isEqual:gestureRecognizer]) {
            return NO;
        }
    
        return NO;
    }
    

    credentials for that goes to internal implementation of LXReorderableCollectionViewFlowLayout

提交回复
热议问题