2012年3月30日金曜日

UIWebViewの画面タップトラップ


UIWebViewの画面がタップされたことを検知しようとしたところ、UIWebViewは内部にUIScrollViewを持ち、さらに実際の描画はそのsubviewが行うため、UIWebViewのサブクラスにイベントを受け取るメソッド(-touchesBegan:withEvent:等)をオーバライドしても呼ばれません。

この場合、hitTestを利用すると画面タップを検知することができます。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    //必要であればevantをチェック
    //superのメソッド呼び出し前後で処理を行う。

    UIView  *v = [super hitTest:point withEvent:event];

    //vは実際にイベントに応答するオブジェクト。イベントを横取りするのでなければvを返す。

    return v;
}

UIViewController(のサブクラス)でも同様の方法でタップを検知できます。

UIViewControllerのviewがUIWebViewの場合は、次のようにhitTestメッセージが送られ、なんらかのscrollViewのサブビューが応答し、そのオブジェクトにイベント関連メッセージが送られます。

UIViewController
⇒UIWebView
    ⇒UIScrollVeiw
        ⇒content view(s)

そのため、UIViewControllerやUIWebViewのイベント関連メソッドをオーバライドしても呼ばれません。

[補足]
hitTestも利用可能ですが、UIGestureRecognizerを使うのがよさそうです。

0 件のコメント: