サブビューとして追加された UIImageView があります。ボタンを押すと表示されます。
アプリケーションの任意の部分で誰かが UIImageView の外側をタップすると、UIImageView が消えてしまいます。
@interface SomeMasterViewController : UITableViewController <clip>
<clip>
@property (strong, nonatomic) UIImageView *someImageView;
stackoverflow と Apple のドキュメントには、私が必要としているようなヒントがいくつかあります。
- Apple の : ジェスチャ レコグナイザ
- Apple の : UIView hitTest:withEvent
- Apple の : UITouch クラス リファレンス
- Stackoverflow: UIGestureRecognizer と共に UITouch イベントをリッスンする
- (おそらく必要ではありませんが..) - CGRectContainsPoint というタイトルの次の投稿で言及
ただし、ここで私のアプローチを確認したいと思います。コードが必要であることは私の理解です
UITapGestureRecognizer を登録して、アプリケーションで発生する可能性のあるすべてのタッチ イベントを取得します
UITapGestureRecognizer では、cancelsTouchesInView と delaysTouchesBegan および delaysTouchesEnded を NO に設定する必要があります。
これらのタッチ イベントを someImageView と比較します (どのように? UIView hitTest:withEvent を使用しますか?)
更新: UITapGestureRecognizer をメインの UIWindow に登録しています。
最終未解決部分
UITapGestureRecognizer が呼び出す handleTap:(UITapGestureRecognizer *) があります。与えられた UITapGestureRecognizer を取得して、タップが UIImageView の外にあるかどうかを確認するにはどうすればよいですか? Recognizer の locationInView は有望に見えますが、期待した結果が得られません。クリックすると特定の UIImageView が表示され、別の場所をクリックすると UIImageView が表示されないことを期待しています。locationInViewメソッドが間違って使用されているように感じます。
これが locationInView メソッドへの呼び出しです。
- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
NSLog(@"handleTap NOT given UIGestureRecognizerStateEnded so nothing more to do");
return;
}
UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
CGPoint point = [gestureRecognizer locationInView:mainWindow];
NSLog(@"point x,y computed as the location in a given view is %f %f", point.x, point.y);
UIView *touchedView = [mainWindow hitTest:point withEvent:nil];
NSLog(@"touchedView = %@", touchedView);
}
次の出力が得られます。
<clip>point x,y computed as the location in a given view is 0.000000 0.000000
<clip>touchedView = <UIWindow: 0x8c4e530; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x8c4c940>>