web-dev-qa-db-ja.com

UICollectionViewはユーザーがダブルタップした場合にのみdidSelectItemAtIndexPathを呼び出し、ユーザーがシングルタップした場合には呼び出しません

私は、画面サイズ程度のUICollectionViewを持っています。表示されるUICollectionViewCellsは、collectionViewと同じサイズです。各セルには、セルのサイズであるUIImageがあります。 CollectionViewではページングが有効になっているため、基本的にはユーザーがスワイプできるフルスクリーンの写真スライドショーです。

問題はそれです
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPathは、ユーザーがセルを2本の指でタップするか、1本の指で長押しした場合にのみ呼び出されます。シングルタップ選択のデフォルトの動作はないようです。 CollectionViewジェスチャレコグナイザーに変更を加えていないため、この問題の解決策を見つけることができません。

52
Kris Gellci

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPathを誤ってオーバーライドしていないのですか? 「選択」と「選択解除」は、Xcodeのコード補完で過去につまずいたことがあります。

200
Owen Mathews

私は同じ問題を抱えていましたが、UITapGestureRecognizerを含むUIViewUICollectionViewがあり、代わりに応答していることがわかりました。

didSelectItemAtIndexPathがトリガーされないのは、ユーザーが2本の指でタップするか、1本の指で長押しした場合にのみUITapGestureRecognizerが機能する理由です。

そのため、そこに到達したすべてのUITapGestureRecognizerをチェックしてください。必ずしもUICollectionViewに直接ではなく、それを含むUIViewにある可能性があります。

126
iDifferent

セルのコンテンツビューを邪魔するセルのビューがある場合、そのセルのデリゲートコールバックにフックすることはできません。

NIBまたはコードのいずれかで、邪魔なビューでのユーザー操作を無効にする必要があります。

view.userInteractionEnabled = NO;

13
Oliver Atkinson

既に解決済みの質問に、タップジェスチャが機能しない可能性があるもう1つの状況を追加してください。

UICollectionViewDelegate's collectionView:shouldHighlightItemAtIndexPath:内でfalseを返す場合、タップジェスチャは機能せず、collectionView:didSelectItemAtIndexPath:は呼び出されません。このデリゲートメソッドのデフォルトの戻り値はtrueであるため、意図的に実装しなくても問題はありません。

8
Blaszard

私は自分でこの問題に遭遇しました。もともとボタンとラベルがありましたが、UIをリファクタリングし、それらのボタン/ラベルをUICollectionViewのセルに変換しました。

最終的にbuttonsがタップを消費していることに気付きました。思いがけず元のボタンをセルに移動しただけで、まっすぐUIImageにしたわけではありませんでした。ボタンに関連付けられたアクションを破棄し、セルの選択を探していたので、少し時間がかかりました。

振り返ってみると愚かで明白ですが、私がやったことを理解するのに数時間かかりました。

3
DBD

Didselectのみを使用する場合:

self.collectionView.allowsMultipleSelection = false

または、その行を削除します。

2

私はちょうど同じ問題を抱えていました... CollectionCellビューでtouchesBeganをオーバーライドしていたため、セルに触れたときにdidSelectItemAtIndexPathが起動しませんでした。オーバーライドを削除し、すべて機能しました。

2
digthewells

私の場合、それはただでした

self.collectionView.allowsSelection  =NO;

私はコードを持っていました。

に変更

self.collectionView.allowsSelection  =YES;

修理する。

1
user1105951

Swift 3とxcode 8でこの問題に遭遇しました。この中にビューとコレクションビューがありました。コレクションビューにはuserInteractionEnabledがtrueになっていますが、まだ機能していませんでした。この問題を修正しました。 shouldHighlightItemAtをオーバーライドして、このメソッドに余分な/カスタムの実装がないため、このメソッドをオーバーライドしませんでした。以下のコードを追加した後、didSelectItemメソッドが呼び出されます。

func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }

たまたまこの問題に出くわしましたが、これを見つけるまで長い一日イライラしていました 「User Interaction Enabled」のチェックを外すだけです CollectionView内の左上のセルを選択したときストーリーボードで。そして問題解決

1
Phan Hoang

私は同様の問題に直面し、私の場合の犯人は、UICollectionView Cellの階層で使用していた CardView であることが判明しました。 CardViewのユーザー操作を無効にするとすぐに、collectionViewはタッチイベントへの応答を開始しました。

1
Love Kumar

ビューからすべてのUIGesturesを削除してから、UICollectionViewセルが正常にやり取りできるかどうかをテストしてみてください。

私の場合、次の行を削除する必要がありました。

let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    self.view.addGestureRecognizer(tap)
0
drfalcoew

それが役立つ場合、これは数時間を費やす愚かな方法で私をかみます。カスタムセルがUICollectionReusableViewではなくUICollectionViewCellをサブクラス化しているかどうかを再確認してください。

0
nandodelauni