0

タッチに応答する大きな UIView があり、タッチに異なる応答をする多くの小さな UIView で覆われています。画面上の任意の場所をタッチしてスライドし、各ビューにタッチされているかどうかを知らせることはできますか?

たとえば、左上に指を置き、右下にスライドします。touchesBegan/Moved は baseView によって収集されます。itemView1、itemView2、itemView3 を渡すと、制御がそれらに渡されます。itemView2 の上で指を離すと、itemView2 の touchesEnded メソッドが実行されます。どの項目にも指を離さないと、baseView の touchesEnded が実行されます。

現時点では、baseView に触れた場合、touchEnded は常に baseView であり、上位の itemView は無視されます。

何か案は?

4

2 に答える 2

1

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

共通ファイルで、TOUCHES_ENDED_IN_SUPERVIEW を @"スーパービューで終了したタッチ" として定義します。

起動している包含​​ビューの touchesEnded メソッドで、追加します

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

サブビューの touchesBegan に、追加します

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

サブビューの touchesEnded メソッドで、イベントに通常のロジックを使用し、さらに追加します

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

touchesEnded イベントを取得せずにページを離れることができる場合に備えて、[[NSNotificationCenter defaultCenter] removeObserver: self] も dealloc に入れることを忘れないでください。

touchesEnded 自体を呼び出す特別な touchesEndedInSuperview メソッドに通知のメッセージを送信する必要があるかもしれませんが、その場合に実行する特別な処理があるかどうかによって異なります。

于 2009-08-17T12:45:59.803 に答える
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];
    }
}
于 2011-02-23T20:48:32.607 に答える