私はサブビューとして追加されたUIImageViewを持っています。ボタンを押すと表示されます。UIImageViewの外でタップする人を検出する方法
誰かがアプリケーションのどの部分でもUIImageViewの外をタップすると、UIImageViewが消えたがります。
@interface SomeMasterViewController : UITableViewController <clip>
<clip>
@property (strong, nonatomic) UIImageView *someImageView;
私が必要とするように聞こえるstackoverflowとappleのドキュメントにはいくつかのヒントがあります。
- Apple's : Gesture Recognizers
- Apple's : UIView hitTest:withEvent
- Apple's : UITouch Class Reference
- Stackoverflow: Listening to UITouch event along with UIGestureRecognizer
- (not likely needed but..) - CGRectContainsPoint as mentioned in the following post titled: Comparing a UITouch location to UIImageView rectangle
しかし、私はここに私のアプローチを確認したいです。これは、コードがUITapGestureRecognizerはそのcancelsTouchesInViewと delaysTouchesBeganを有するべきであり、NOに設定delaysTouchesEndedアプリケーション
に発生する可能性があり、すべてのタッチイベントを取得するためにUITapGestureRecognizerを登録
する必要があるというのが私の理解です。 (?UIViewのhitTestを使用する方法:withEventを?)
- はsomeImageViewで、これらのタッチイベントを比較
更新:私は、メインUIWindowとUITapGestureRecognizerを登録しています。 (UITapGestureRecognizer *)UITapGestureRecognizerが呼び出すこと:
最終未解決の一部は
私はhandleTapを持っています。指定されたUITapGestureRecognizerを取得し、そのタップがUIImageViewの外側にあるかどうかを確認するにはどうすればよいですか? RecognizerのlocationInViewは有望ですが、私は期待した結果を得られません。 UIImageViewをクリックしたときに特定のUIImageViewが表示され、別の場所をクリックしたときにUIImageViewは表示されません。 locationInViewメソッドが間違って使用されているような気がします。
<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>>
ありがとう:私は次の出力を得る
- (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);
}
:
はここlocationInViewメソッドに私の呼び出しです!
ありがとう!ところで、あなたはtouchesBegan:touchesBegan:touches forEvent:eventの代わりにwithEventを意味するのでしょうか、それとも何か不足していますか? :) – finneycanhelp
私はその提案が好きだった。しかし、touchesBegan:withEventはUITableViewControllerで呼び出されません。私は私がhttp://stackoverflow.com/questions/6286230/touches-began-in-uitableviewcontrollerに入っていると思います – finneycanhelp
はい、そうです。 2倍。これを修正する方法がわからない場合は、試してみることにします。もしあなたがそれを把握したら、私たちに知らせてください! – samson