2012-04-06 5 views
4

私はサブビューとして追加されたUIImageViewを持っています。ボタンを押すと表示されます。UIImageViewの外でタップする人を検出する方法

誰かがアプリケーションのどの部分でもUIImageViewの外をタップすると、UIImageViewが消えたがります。

@interface SomeMasterViewController : UITableViewController <clip> 

<clip> 

@property (strong, nonatomic) UIImageView *someImageView; 

私が必要とするように聞こえるstackoverflowとappleのドキュメントにはいくつかのヒントがあります。

しかし、私はここに私のアプローチを確認したいです。これは、コードがUITapGestureRecognizerはそのcancelsTouchesInViewと delaysTouchesBeganを有するべきであり、NOに設定delaysTouchesEndedアプリケーション

  • に発生する可能性があり、すべてのタッチイベントを取得するためにUITapGestureRecognizerを登録

    1. する必要があるというのが私の理解です。 (?UIViewのhitTestを使用する方法:withEventを?)

    2. は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メソッドに私の呼び出しです!

  • 答えて

    4

    私はあなただけ[event touchesForView:<image view>]を言うことができると思います。空の配列が返された場合は、イメージビューを閉じます。テーブルビューコントローラのtouchesBegan:withEvent:でこれを行い、[super touchesBegan:touches withEvent:event]に電話するか、テーブルビューが完全に機能しなくなります。おそらくtouchesEnded:/Cancelled:...、またはtouchesMoved:...を実装する必要はありません。

    この場合、UITapGestureRecognizerは間違いなく過度のようです。

    +0

    ありがとう!ところで、あなたはtouchesBegan:touchesBegan:touches forEvent:eventの代わりにwithEventを意味するのでしょうか、それとも何か不足していますか? :) – finneycanhelp

    +0

    私はその提案が好きだった。しかし、touchesBegan:withEventはUITableViewControllerで呼び出されません。私は私がhttp://stackoverflow.com/questions/6286230/touches-began-in-uitableviewcontrollerに入っていると思います – finneycanhelp

    +0

    はい、そうです。 2倍。これを修正する方法がわからない場合は、試してみることにします。もしあなたがそれを把握したら、私たちに知らせてください! – samson

    2

    あなたはそれを行うにはタッチ機能を使用することができます。ユーザーは、最初の画面をタッチすると、あなたのtouchBegan機能は

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 
    

    と呼ばれています。touchBeganで

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
    
        CGPoint pt = [[touches anyObject] locationInView:self]; 
    } 
    

    ので、あなたはポイントがあなたのUIImageViewまたはないことを見つけなければならないtouched.Thenポイントそのユーザーを持っています。

    しかし、UIImageViewsにタグを付けることができます。それはかなり簡単でしょう。

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    
         UITouch *touch = [touches anyObject ]; 
    
         if(yourImageView.tag==[touch view].tag){ 
    
         [[self.view viewWithTag:yourImageView.tag] removeFromSuperView]; 
         [yourImageView release]; 
    
         } 
    } 
    
    +0

    ありがとうコード例! – finneycanhelp

    +0

    すごく感謝してくれてありがとう:) –

    関連する問題