1

私の実装は UICollectionViewController に基づいています。タッチダウンとアップのイベントを認識するために、UiTableCell にタッチ動作を実装しようとしました。私の解決策は少しの調査に基づいていますが、それが適切な方法であるかどうかはわかりません。

すべてのテーブル セルに UITapGestureRecognizer をアタッチします。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    NSDictionary *homeItem = self.homeItems[indexPath.row];
    HomeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:homeItem[@"cell"] forIndexPath:indexPath];

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cellClicked:)];
    //NSArray* recognizers = [cell gestureRecognizers];
    //    tapGesture.numberOfTapsRequired = 1;
    tapGesture.numberOfTouchesRequired = 1;

//    // Make the default gesture recognizer wait until the custom one fails.
//    for (UIGestureRecognizer* aRecognizer in recognizers) {
//        if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]])
//            [aRecognizer requireGestureRecognizerToFail:tapGesture];
//    }

    [cell addGestureRecognizer:tapGesture];

    return cell;
}

ただし、宣言されたアクションは、レコグナイザーの状態 3 (UIGestureRecognizerStateEnded) に対して 1 回だけ呼び出されます。

- (void)cellClicked:(UIGestureRecognizer *)recognizer {
    Log(@"cellClicked with state: %d", [recognizer state]);
}

これはすべて、CollectionView 動作のデフォルトの実装が原因である可能性があります。

私はobjcとiosの開発に慣れていないので、状態を介してセルのスタイリングを変更するために実装を完了するために何ができるかわかりません。

4

1 に答える 1

4

iOSのイベント処理ガイド で説明されているように、ジェスチャ レコグナイザーには、離散型と連続型の 2 種類があります。AUITapGestureRecognizerは離散的です。つまり、ジェスチャを認識したときにアクション メッセージを 1 つだけ送信します。

UITapGestureRecognizersend the action in stateなどの個別の認識機能UIGestureRecognizerStateRecognizedは、 のエイリアスですUIGestureRecognizerStateEnded

タッチダウン イベントとタッチアップ イベントを別々に認識したい場合は、カスタム サブクラスUICollectionViewCell(またはイベントを検出する必要がある任意のビュー) を使用しtouchesBegan:withEvent:、関連するメッセージをオーバーライドすることをお勧めします。

于 2013-02-11T08:01:36.207 に答える