私は、画面サイズ程度のUICollectionViewを持っています。表示されるUICollectionViewCellsは、collectionViewと同じサイズです。各セルには、セルのサイズであるUIImageがあります。 CollectionViewではページングが有効になっているため、基本的にはユーザーがスワイプできるフルスクリーンの写真スライドショーです。
問題はそれです-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
は、ユーザーがセルを2本の指でタップするか、1本の指で長押しした場合にのみ呼び出されます。シングルタップ選択のデフォルトの動作はないようです。 CollectionViewジェスチャレコグナイザーに変更を加えていないため、この問題の解決策を見つけることができません。
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
を誤ってオーバーライドしていないのですか? 「選択」と「選択解除」は、Xcodeのコード補完で過去につまずいたことがあります。
私は同じ問題を抱えていましたが、UITapGestureRecognizer
を含むUIView
にUICollectionView
があり、代わりに応答していることがわかりました。
didSelectItemAtIndexPath
がトリガーされないのは、ユーザーが2本の指でタップするか、1本の指で長押しした場合にのみUITapGestureRecognizer
が機能する理由です。
そのため、そこに到達したすべてのUITapGestureRecognizer
をチェックしてください。必ずしもUICollectionView
に直接ではなく、それを含むUIView
にある可能性があります。
セルのコンテンツビューを邪魔するセルのビューがある場合、そのセルのデリゲートコールバックにフックすることはできません。
NIBまたはコードのいずれかで、邪魔なビューでのユーザー操作を無効にする必要があります。
view.userInteractionEnabled = NO;
既に解決済みの質問に、タップジェスチャが機能しない可能性があるもう1つの状況を追加してください。
UICollectionViewDelegate'
s collectionView:shouldHighlightItemAtIndexPath:
内でfalse
を返す場合、タップジェスチャは機能せず、collectionView:didSelectItemAtIndexPath:
は呼び出されません。このデリゲートメソッドのデフォルトの戻り値はtrue
であるため、意図的に実装しなくても問題はありません。
私は自分でこの問題に遭遇しました。もともとボタンとラベルがありましたが、UIをリファクタリングし、それらのボタン/ラベルをUICollectionView
のセルに変換しました。
最終的にbuttonsがタップを消費していることに気付きました。思いがけず元のボタンをセルに移動しただけで、まっすぐUIImage
にしたわけではありませんでした。ボタンに関連付けられたアクションを破棄し、セルの選択を探していたので、少し時間がかかりました。
振り返ってみると愚かで明白ですが、私がやったことを理解するのに数時間かかりました。
Didselectのみを使用する場合:
self.collectionView.allowsMultipleSelection = false
または、その行を削除します。
私はちょうど同じ問題を抱えていました... CollectionCellビューでtouchesBeganをオーバーライドしていたため、セルに触れたときにdidSelectItemAtIndexPathが起動しませんでした。オーバーライドを削除し、すべて機能しました。
私の場合、それはただでした
self.collectionView.allowsSelection =NO;
私はコードを持っていました。
に変更
self.collectionView.allowsSelection =YES;
修理する。
Swift 3とxcode 8でこの問題に遭遇しました。この中にビューとコレクションビューがありました。コレクションビューにはuserInteractionEnabledがtrueになっていますが、まだ機能していませんでした。この問題を修正しました。 shouldHighlightItemAtをオーバーライドして、このメソッドに余分な/カスタムの実装がないため、このメソッドをオーバーライドしませんでした。以下のコードを追加した後、didSelectItemメソッドが呼び出されます。
func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
return true
}
たまたまこの問題に出くわしましたが、これを見つけるまで長い一日イライラしていました 「User Interaction Enabled」のチェックを外すだけです CollectionView内の左上のセルを選択したときストーリーボードで。そして問題解決
私は同様の問題に直面し、私の場合の犯人は、UICollectionView Cellの階層で使用していた CardView であることが判明しました。 CardViewのユーザー操作を無効にするとすぐに、collectionViewはタッチイベントへの応答を開始しました。
ビューからすべてのUIGesturesを削除してから、UICollectionViewセルが正常にやり取りできるかどうかをテストしてみてください。
私の場合、次の行を削除する必要がありました。
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
self.view.addGestureRecognizer(tap)
それが役立つ場合、これは数時間を費やす愚かな方法で私をかみます。カスタムセルがUICollectionReusableViewではなくUICollectionViewCellをサブクラス化しているかどうかを再確認してください。