1. ホーム
  2. ios

[解決済み] UICollectionViewCellの長押しジェスチャー

2022-09-19 17:34:17

質問

UICollectionView(のサブクラス)に長押しジェスチャー認識機能を追加する方法を教えてください。ドキュメントには、デフォルトで追加されると書いてありましたが、方法がわかりません。

私がやりたいことは セル上で長押し ( githubのカレンダーみたいなのがある。 を長押しして、どのセルがタップされたかを取得し、それを使って何かをすることです。どのセルが長押しされたのか知りたいのですが。この広い質問で申し訳ありませんが、私はグーグルまたはSOのいずれかでより良いものを見つけることができませんでした。

どのように解決するのですか?

オブジェクトC

あなたの myCollectionViewController.h ファイルに UIGestureRecognizerDelegate プロトコル

@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>

の中に myCollectionViewController.m ファイルに記述します。

- (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
    }
}

スウィフト

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))

スウィフト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))