[解決済み] iOSのイベントハンドリング - hitTest:withEvent:とpointInside:withEvent:はどのように関係しているのでしょうか?
2022-05-10 23:48:35
質問
多くのアップルの文書は非常によく書かれていますが、私は、' iOS のためのイベント処理ガイド は例外だと思います。そこに記述されていることを明確に理解するのは難しいです。
ドキュメントによると
ヒット・テストにおいて、ウィンドウが呼び出す
hitTest:withEvent:
を呼び出します。このメソッドは、ビュー階層の最上位にあるビューに対して再帰的にpointInside:withEvent:
を再帰的に呼び出し、タッチが行われた境界内のサブビューを見つけるまで、階層を下っていきます。そのビューがヒットテストビューになります。
ということは
hitTest:withEvent:
のみが呼び出され、システムからは
pointInside:withEvent:
を呼び出し、特定のサブビューからのリターンがYESの場合、そのサブビューの
pointInside:withEvent:
を呼び出し、そのサブビューのサブクラスの?
どのように解決するのですか?
それは非常に基本的な質問のようです。しかし、私はあなたと同意する文書が他の文書ほど明確ではないので、ここに私の答えがあります。
の実装は
hitTest:withEvent:
をUIResponderで実装すると、次のようになります。
-
を呼び出します。
pointInside:withEvent:
のself
-
リターンがNOの場合
hitTest:withEvent:
が返されます。nil
.終わりです。 -
リターンがYESの場合、以下を送信します。
hitTest:withEvent:
メッセージをそのサブビューに送ります。 はトップレベルのサブビューから始まり、他のビューへと続きます。 が非nil
オブジェクトを返すか、すべてのサブビューがメッセージを受信するまで、他のビューに続きます。 -
サブビューが非
nil
オブジェクトを返した場合、最初のhitTest:withEvent:
はそのオブジェクトを返します。 で終わりです。 -
を返すサブビューがない場合、非
nil
オブジェクトを返さない場合、最初のhitTest:withEvent:
が返すself
この処理は再帰的に繰り返されるため、通常は最終的にビュー階層のリーフビューが返されます。
しかし
hitTest:withEvent
を上書きして別のことをすることもできます。多くの場合、オーバーライドされた
pointInside:withEvent:
をオーバーライドする方がシンプルで、アプリケーションのイベント処理を調整するのに十分なオプションを提供します。
関連
-
制御が非ボイド関数の終了に達する
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] Xcode 7のエラーです。"Missing iOS Distribution signing identity for ..." (iOS配布用署名IDがありません)
-
[解決済み] iOSで画面の幅と高さを取得する方法は?
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み】iOSアプリの名前を変更する方法は?
-
[解決済み】layoutSubviewsはいつ呼び出されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列の長さを取得する
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] iOSシミュレータでスクリーンショットを撮る
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] iPhoneでナビゲーションバーを1ページ目だけ非表示にする
-
[解決済み] ぼかしの入ったオーバーレイビューの作成