UIWebViewでタッチイベントを取得するには

HTMLを表示出来るUIWebView は便利でビューですが、そのままでは、指でタッチしたりピンチしたイベントがとれません。そこでいろいろと試してみた事を書いてみます。



UIWebViewをハック

書籍やネットを探し UIWebView の touch イベントをフックする方法 - Windchaseに書かれた方法を試したところタッチイベントを取得できるようになりました。この方法は UIWebViewが継承している UIDocumentView クラスというWebViewの実体(?)である非公開のクラスの持っているタッチイベントメソッドを書き換えて タッチイベントを デリゲートするという力業を使っています。

しかし、このコードは iOS4 (たぶん iOS3.2)では動きません。iOS3.2からはUIDocumentViewクラスがUIWebBrowserViewクラスに変わっていますが、そこを変更しただけでは動きませんでした。

UIWindowのイベントをデリゲートする

そこで次に試したのは [iPhone] UIWebView のタッチイベントを取得する | Sun Limited Mt. でした。これは iOS4でもiOS3.1 でも動作しました。

この方法は、画面に対する全てのイベントを受け取れる UIWindow のイベント処理メソッドで上に乗っている UIWebView関連のタッチイベントのみをデリゲートするという、まっとうなやり方です。


しかし、ここに書かれた GestureWindow という UIWindowクラスをカスタマイズ(継承)したクラスを使うと画面の auto rotate (iPhoneの画面を横向きに対応させたりする機能) が正しく動かなくなってしまいました ^^);


いろいろと試したのですが、ダメで twitter につぶやいてみました。

すると、神の声 岸川さん が GestureWindowクラスのdelegateという名前のインスタンス変数(プロパティー) がまずいんじゃない? というつぶやきが !!


早速、delegateという名前のインスタンス変数(プロパティー) を wDelegateに変更したところ auto rotate も機能するようになりました !!


ドキュメント上では UIWindowと、継承しているクラスには delegateプロパティーが在るように書かれていませんが、実は存在するようです・・・・・


ということで 岸川さん ありがとうございます m(_ _)m