UIWebViewにドキュメントを表示しています。ドキュメントの上にホットスポットを配置して、タップされたときにアクションをトリガーしたいのですが、ダブルタップされたときにドキュメントを自動ズームするデフォルトのUIWebView動作も維持したいと思います。UIWebViewをダブルタップに応答させながら、シングルタップに応答する方法がわかりません。
最初にホットスポットをアクション付きの透過的なUIButtonとして設定しましたが、ホットスポットをダブルタップすると、ホットスポットアクションが2回呼び出されました。そこで、ボタンからアクションを削除し、代わりにシングルタップジェスチャを添付しました。
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
これは、通常のボタンアクションと同じように機能します。しかし、次にダブルタップジェスチャを作成し、requireGestureRecognizerToFailを使用してシングルタップジェスチャをブロックするように構成しました。
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(zoomWebView:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[self.hotspot addGestureRecognizer:doubleTap];
[doubleTap release];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
[singleTap requireGestureRecognizerToFail:doubleTap];
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
- (void)zoomWebView:(UITapGestureRecognizer *)gesture {
NSLog(@"double tap");
}
この設定では、ホットスポットをシングルタップするとsingleTapActionが呼び出され、ホットスポットをダブルタップするとzoomWebView(カスタムメソッド)が呼び出されます。これは、singleTapActionが2回呼び出されなくなったため良いことですが、UIWebViewがダブルタップに応答しなくなったため悪いことです。
UITapGestureRecognizerをサブクラス化し、touchesBeganメソッドとtouchesEndedメソッドをオーバーライドし、それらの引数をUIWebViewの対応するメソッドに送信することにより、doubleTapジェスチャからUIWebViewにダブルタップイベントを転送しようとしました。これを行うと、サブクラスがイベントを受信していることがわかりましたが、UIWebViewは転送されたイベントに応答しませんでした。iOSのイベント処理ガイドでは、イベントはUIKitフレームワークオブジェクトではなく、UIViewのカスタムサブクラスにのみ転送できると記載されているため、これは予想されることです。
シングルタップジェスチャがダブルタップイベントを迂回させないダブルタップに応答しないようにする方法はありますか?これは基本的な要件のように思えますが、それを行うための簡単な方法がわかりません。UIGestureRecognizerのタッチ配信プロパティについて読んで実験しましたが、値の組み合わせによって、シングルタップジェスチャがダブルタップジェスチャを消費するのを防ぐことはできませんでした。
ちなみに、私のビュー階層におけるホットスポットとUIWebViewの関係は、「いとこ」の関係です。これらは、2つの兄弟ビューのサブビューです。ホットスポットビュー、Webビュー、またはそれらの「祖父母」ビューにジェスチャレコグナイザーを追加すると、同じ結果が得られます。