- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
少し調べてみたのでメモ。推測も入っているので注意。
UIViewのメソッドです。
hitTest:withEvent:は、画面がタッチされた時にシステム(UIKit?)がタッチイベントの対象となるビューを特定するためのテストへの返答を行います。
動作
画面がタッチされると、まずメインウィンドウのhitTest:withEvent:が呼ばれます。これを起点とし、hitTest:withEventを呼ばれたビューがサブビューのhitTest:withEvent:を呼び、それを繰り返すことでビュー階層を辿り最終的にタッチイベントの対象となるビューを特定します。
hitTest:withEvent:を呼ばれたビューは、pointで示されるタッチ位置が自身に含まれるかをチェックします。含まれていないならnilをスーパービューに返します。
タッチ位置を含んでいてかつ自身がサブビューを保持していなければ、自身のインスタンスを返すことで、タッチイベントの対象であることをスーパービューに伝えます。
タッチ位置を含んでいてかつサブビューを保持していれば、サブビューの中で最も前面にあるもののhitTest:withEvent:を呼びます。そのサブビューがタッチ位置を含んでいなければその次に前面にあるサブビューのhitTest:WithEvent:を呼ぶことを繰り返します。
サブビューの中でインスタンスを返すものがあれば、自身もそのインスタンスをスーパービューに返し、サブビューが全てnilを返せば自身のインスタンスをスーパービューに返します。
たぶんこんなことをしているのだと思う。
利用
このメソッドをオーバーライドすることで、本来なら他のビューの背面にあることでタッチイベントの対象とならないようなビューにもタッチイベントを受け取らせるようにすることができたりします。(その場合前面にあるビューにおいてこのメソッドでnilを返すようにする。)