2011-02-04 2 views
2

UIViewという小さなものを作成しました。これには2つのUIButtonが含まれています。ビューはUITapGestureイベントに応答します。ボタンはTouchUpInsideに応答するはずですが、ボタンをタップするとレスポンダが下にあり、タップジェスチャセレクタがトリガされます。アドバイスや提案を探しています。UIButtonのタッチイベントが基になるビューに落ちます

+0

私は何をやってしまってきたことのためにUIButtonsを取引されています添付のタップジェスチャ認識機能を持つUIView。これは私がボタンが動作すると予想したように動作するようです。 – Kyle

答えて

0

ビュー階層のビューの順序はどのようになっていますか?また、IBでインターフェイスを作成していますか?接続を正しく接続すると、これはまったく問題ではありません。

+0

これは私がやったことです。 – Kyle

0

各UIViewには 'exclusiveTouch'プロパティがあります。 YESに設定されている場合、ビューはレスポンダチェーンのタッチを通過しません。あなたのUIButtonsでこのプロパティを設定してみて、違いがあるかどうか確認してください。

+0

私はこれを撃つでしょう。 – Kyle

0

このデザインの問題は、あるボタンを別のボタンに埋め込むことと似ていることです。正当な理由があるかもしれませんが、イベントの流れにはもっと注意する必要があります。

ジェスチャ認識機能は、サブビュー(ケースの2つのボタン)に到達する前に接触を傍受します。 UIGestureRecognizerDelegateプロトコル、つまりgestureRecognizer:shouldReceiveTouch:メソッドを実装し、タッチが2つのボタンのいずれかにある場合はNOを返します。これにより、オレンジ色の表示がボタンを意図したタッチを邪魔するのを防ぐことができ、ボタンが期待どおりに動作するようになります。

+0

私はこれについて考えましたが、アニメーション(ボタンの青い点滅)がボタンの応答を示しているにもかかわらず、タッチに応答しているビューは基本的なビューです。 – Kyle

3

あなたは、オレンジ色のビューでタップジェスチャーに反応する方法変更することができます:あなたはUIButtonに触れた場合、タップは、基礎となるビューによって無視されます。この方法で

-(void) handleTapFrom:(UITapGestureRecognizer*) recognizer { 
    CGPoint location = [recognizer locationInView:orangeView]; 
    UIView *hitView = [orangeView hitTest:location withEvent:nil]; 

    if ([hitView isKindOfClass:[UIButton class]]) { 
     return; 
    } 

    //code that handle orange view tap 
    ... 
} 

を。

1

正しい答えはfound hereです。私はthis post経由でこの答えにつながった。短期使用では

tapRecognizer.cancelsTouchesInView = NO; 

「すべて タップをキャッチする唯一の一つであることがタップ認識を防ぐ」