LoginSignup
14
11

More than 5 years have passed since last update.

hitTestの仕組み

Last updated at Posted at 2016-03-16

- (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を返すようにする。)

14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11