2009-08-17 9 views
0

私はタッチに反応する大き​​なUIViewを持っています。タッチに違った小さなUIViewがたくさんあります。画面上のどこにでも触れて回ることは可能ですか?それが触れられているかどうかを各視点で知ることができますか?上位のサブビューに触れたことを検出できますか?

たとえば、指を左上に、右下にスライドさせます。 touchesBegan/MovedはbaseViewによって収集されます。 itemView1、itemView2、およびitemView3を渡すと、コントロールはそれらに渡されます。 itemView2上で指を離すと、itemView2のtouchesEndedメソッドが実行されます。アイテムの上に指を置くと、baseViewのtouchesEndedが実行されます。

現時点では、私がbaseViewをタッチすると、touchEndedは常にbaseViewになり、上位のitemViewsは無視されます。

アイデア?

答えて

1

私が正しく理解すると、touchesEndedイベントは検出されましたが、それについて知る必要のあるサブビューでは検出されません。です。

一般的なファイルでは、TOUCHES_ENDED_IN_SUPERVIEWを@ "superviewで終了しました"と定義します。 発射であることを含むビューのtouchesEnded方法において

、サブビューのtouchesEnded方法において

[[NSNotificationCenter defaultCenter] addObserver: self 
    selector: @selector(touchesEnded:) 
    name: TOUCHES_ENDED_IN_SUPERVIEW 
    object: self.superview]; 

を追加し、サブビューのtouchesBeganで

[[NSNotificationCenter defaultCenter] postNotificationName: TOUCHES_ENDED_IN_SUPERVIEW object: self]; 

を追加し、使用イベントの通常のロジックを入力してください。

[[NSNotificationCenter defaultCenter] removeObserver: self name: TOUCHES_ENDED_IN_SUPERVIEW object: self.superview]; 

touchesEndedイベントを受け取らずにページを出ることができる場合は、[[NSNotificationCenter defaultCenter] removeObserver:self]をdeallocに入れてください。

通知は、touchesEnded自体を呼び出す特別なtouchesEndedInSuperviewメソッドにメッセージを送信することができますが、その場合は特別な処理があるかどうかによって異なります。

+0

おかげAmagrammer、私はこのショットを与えるでしょう。それは私にとってはいいようですが、これからは私のコードを分割して、そのゲートをもう一度開こうとはしません。それが動作すれば、私はあなたに知らせることが確実になります。 –

0

あなたはこのようなものを使用することができます。


-(void)touchesEnded: (NSSet *)touches 
      withEvent: (UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView: touch.view]; 
    if (CGRectContainsPoint(control1.frame, location)) { 
     [self control1Action]; 
    } else if (CGRectContainsPoint(control2.frame, location)) { 
     [self control2Action]; 
    } 
} 
関連する問題