2011-12-18 14 views
0

私はビュー(parent)に2つのサブビュー、もう1つ()のもう1つのサブビュー(bottomChild)を持っています。兄弟のサブビューはiPhoneで接触しません

画面をタップすると、topChildparentだけがタッチイベントを受信します。

タッチイベントをbottomChildに伝播するために変更する必要はありますか?

コード:

MYViewだけ touchesBeganをログに記録します UIViewのサブクラスである
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    MYView* parent = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    parent.tag = 3; 
    parent.backgroundColor = [UIColor redColor]; 

    MYView* bottomChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)]; 
    bottomChild.tag = 2; 
    bottomChild.backgroundColor = [UIColor blueColor]; 
    [parent addSubview:bottomChild]; 

    MYView* topChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)]; 
    topChild.tag = 1; 
    topChild.backgroundColor = [UIColor greenColor]; 
    [parent addSubview:topChild]; 
    [self.view addSubview:parent]; 
} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"%d", self.tag); 
    [super touchesBegan:touches withEvent:event]; 
} 

結果:緑豊かなエリアに触れる

enter image description here

は、次のログを生成します。

TouchTest[25062:f803] 1 
TouchTest[25062:f803] 3 

私の最初のアイデアはparentがその子へのすべてのtouchesSomethingのコールを伝播することでしたしかし、(A)私はおそらくより簡単なsolutioかもしれないと思うnと(B)子供がイベントを親に送信したかどうかわかりませんが、同じビューにメッセージtouchesSomethingを2回送信すると、セナニガンが発生する可能性があります。

質問をしたところ、postは、接触を受け取るビューを変更するためにhitTestを無効にすることを提案しています。私はこのアプローチを試み、問題があればそれを更新します。

答えて

1

あなたが持っている興味深い問題は、おそらくあなたが物事を構造化する方法を考え直すことで最も適切なものです。しかし、現在のトップビューでタッチイベントをキャッチする必要があることを示唆するように動作させるには、それを親に渡してから親ビューのすべてのサブビューに伝播させます。この作業を行うには、touchesBegan:(またはタッチを傍受するために使用する他の方法)が必要です。すべてのビューで何も行わず、親ビューから呼び出されたメソッドでのみアクションを実行します。

実際には、ビューのタッチを処理せず、キャッチして親ビュービューに通知し、必要に応じて必要に応じてサブビューメソッドを呼び出すという別の方法があります。

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // Do nothing, parent view calls my parentNotifiedTouchesBegan method 
    [self.superview touchesBegan:touches withEvent:event]; 
} 

- (void) parentNotifiedTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // Act on the touch here just as my sibling views are doing 
} 

注私は、そのコードにself.superviewsuperを変更しました。あなたは何をしているのかに応じてsuperの方法に電話したい場合もあれば、電話する場所がparentNotifiedTouchesBeganの場合もあります。

イベントを送信したサブビューを知ることができます。touchesBegan:を呼び出す代わりに、カスタムメソッドを使用してスーパービューに通知するだけです。 self引数を使用してください。あなたが子供にタッチを必要としない場合は

+0

おかげでアダムを設定しました!このソリューションはジェスチャ認識ツールと互換性がありますか?一見すると、私はこの道を行くならば、私は車輪を再実装する必要があるように見えます。 – hpique

+0

そして私は物事を再構築したいと思っていますが、私の場合はどうなっているのでしょうか。 topChildは透過性を持ち、topChildとbottomChildの両方が "動く"ことができます(したがって、topChildはbottomChildのサブビューにはなれません)。両方とも接触する必要があります。 – hpique

+0

コールバックで受け取ったgestureRecognizerオブジェクトを単純なタッチではなく親に渡すだけでよいでしょう。少なくとも私が便利なのは、このプロジェクトではUIPinchGestureRecognizerのために働くでしょう。 –

0

はその後

bottomChild.userInteractionEnabled = NO; 
topChild.userInteractionEnabled = NO; 
関連する問題