`サブビューとして UIImageView を持つビューを取得しました。メイン ビューには、99% の確率で動作するシングル タップ GestureRecognizer があります。
時々、ジェスチャ認識エンジンが失敗したように見え、イベントがスタックから次のレスポンダーにプッシュされます。そのトップ ビューの hitTest メソッドにブレークポイントを追加しました。ヒット テスト メソッドは、イベントが間違った場所に移動した場合を含め、すべてのケースで最も内側の UIImageView を正しく返します。
ビューが hitTest の結果であるにもかかわらず、ジェスチャ レコグナイザーにイベントが渡されないのは、どのような状況ですか? ジェスチャ セレクターが呼び出されない場合、hitTest ブレークポイントからこのデバッグ コードを出力しました。
(lldb) po u
$2 = 0x20854520 <UIImageView: 0x20854520; frame = (0 0; 61 62); opaque = NO; layer = <CALayer: 0x208e7670>>
(lldb) po [u superview]
$0 = 0x1fd225e0 <HotspotView: 0x1fd225e0; frame = (303 663; 61 62); gestureRecognizers = <NSArray: 0x2082b850>; layer = <CALayer: 0x1fd15af0>>
(lldb) po ((HotspotView *)u.superview).gestureRecognizers
$1 = 0x208bc940 <__NSArrayI 0x208bc940>(
<UITapGestureRecognizer: 0x20828fa0; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <HotspotView 0x1fd225e0>; target= <(action=handleSingleTap:, target=<HotspotView 0x1fd225e0>)>>
)
u
ヒット テスト (UIImageView) の結果です。u.superview
ジェスチャ レコグナイザがアタッチされているコンテナ ビューです。ここでu.superview
、ジェスチャ認識機能があることを確認します。では、そのイベントを受け取るべきではありませんか? このイベントが singleTap にならず、代わりに次のレスポンダーにバブルアップするのはどのような状況ですか?
編集:問題を再びキャプチャすることができました (前回発生したとき、数分後に XCode がクラッシュしました...)。touchesBegan は、ジェスチャ認識エンジンの呼び出しに失敗した場合でも、タッチを正しく取得します。成功したタップと失敗したタップの両方について (GR を呼び出すかどうかに関して) タッチ イベントとタッチ イベントをログに記録しましたが、それらは同じように見えます。
だから、今、私はさらに迷子になっています。
1) ヒット テストのために適切なオブジェクトが返される
2) 適切なオブジェクトが touchesBegan 呼び出しを受け取る
3) オブジェクトにジェスチャレコグナイザが
ある 4) それでも、ジェスチャ レコグナイザが呼び出されないことがあります (信頼性がなく、再現が非常に困難です)。 .