0

私のアプリケーションでは、ユーザがUIImageViewというマップ(.PNG)を見ることができるUIScrollviewがあります。 UIScrollViewは、マップを囲んでパンとスクロールを処理するために使用されます。スクロールビュー内の画像ビュー内のuibuttonをタップ

地図上に余分な興味のあるポイント(ボタン)をタッチしたときに「追加」できるようにしたいのですが、これを行うにはUIScrollViewにタップリスナーを追加しました。上の場所に(滞在を

[plattegrondImageview addSubview:plattegrondPunt]; 

そのように要素のスクロールをきれいに沿って画像を:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 

[myScrollview addGestureRecognizer:tap]; 

タップが登録されているとき、私はUIButtonを作成し、UIScrollViewの内側にこのボタンをUIImageViewを追加します与えられた座標)。ここまでは順調ですね。

しかし、今ではユーザーが「ボタン」をタップすることができます(たとえば、Popover画面を開いてコメントを入力するなど)。

私はタップをリッスンするためにボタンにターゲットを追加した

:問題のために今

[poi addTarget:self action:@selector(puntTap:) forControlEvents:UIControlEventTouchUpInside]; 

ユーザータップのボタンの上に、セレクタ(puntTap)が正しく発射されるたびにUIScrollviewのメインタップジェスチャーも発動します。

popoverビューが開かれているだけでなく、余分なUIButton要素が画面に表示されます。

UIScrollviewもタップを登録するのは論理的ですが、この場合は望ましくない動作です。ユーザーがscrollviewUIButtonをタップすると、scrollview自体は応答しないでください。 >UIScrollview

----->UIImageView

---------->UIButton

私は既に持っている -

:レイヤーを可視化するために

スクロールビューの次のプロパティを有効にしました。

myScrollview.userInteractionEnabled = YES; 
myScrollview.canCancelContentTouches = YES; 
myScrollview.delaysContentTouches = YES; 

私はそれがタップされるボタンでないかどうかを確認するために、(UIScrollviewのタップジェスチャー付き)hittestような何かを行うことができると思います - しかし、おそらく誰かが「クリーン」ソリューションを持っていますか?

を要約(何が、私はセットアップ画面を持っている方法については不明である場合は、そう言ってください):ユーザーがUIButtonをタップすると、scrollviewGestureRecognizerも発射!

答えて

0

ボタンのこのプロパティを設定します。

myButton.exclusiveTouch = YES; 

このように、タッチがその下のビューに移行するのを防止します。

+0

残念ながら、このトリックをやっていないようですが、スクロールビュー/タップはまだ起動します。私はボタンでそれを設定しましたが、実際にはタッチも(タップ)(ボタンはビュー最後にダウンです)を得る '上'のビュー – YDL

1

scrollviewのuserInteractionEnabledをuibuttonのFalse/Noに設定してtouchesbeganを設定し、uibutton touchesEndedで再度有効にすることができます。

もう1つ、おそらくより良いオプションは、uibutton exclusiveTouchプロパティをYESに設定します。

編集:上記のあなたのコメントを見ました。タッチがスクロールビューからあなたのuibuttonに伝播しているようです。その場合、スクロールビューのタッチ座標を確認し、ボタンがその付近に存在しない場合にのみ新しいボタンを追加する必要があります(とにかく良いアイデアでしょうか?)。ボタンの位置をそのまま保存していると仮定して、現在のリストを確認してください。 (テストしていません)

+0

答えをありがとう!タッチは実際にスクロールビューから伝播しているようです(排他的なタッチは目に見える効果がありません) - 私は今、あなたがHitTestで提案したものを正確にやっています。よりよいアイデア(パフォーマンス)) – YDL

1

だけアイデア

あなたの代わりに直接ターゲットを設定するのでは、ボタンの上に別のものを使用しようとするよりも、あなたのGesutureRecognizersに固執します。だから、他の1キャンセルする最初の認識機能を設定することができます。

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

もう一つのアイデアは、ボタンをタッチした場合は、チェックするためにUIScrollViewをサブクラス化することでhitTest:を上書きすることです。

+0

Thanx!最初のアイデアはオプションのように聞こえるが、私が信じるボタン(TouchUpInsideなど)からスタンダードなタッチイベントも失うだろう - 私は2番目のアイデアを実装している(サブクラス化はしていないが)スクロールビューのタップ認識機能の内側に表示されます。ヒットしたビューのタイプがUIButtonである場合、そのタップジェスチャーの後続のプロセスを取り消します(そして私のボタンはアクションを引き継ぎます)。 – YDL

+0

はい、ジェスチャー認識ツール内のボタン状態をトリガーしてそれらを保持する必要があります。 – calimarkus

0

私はこの問題がレスポンダーチェーンの実装が不完全であると考えています。

tapGestureUIScrollViewを登録しているので、それはその上で実行されるすべてのタップジェスチャーを処理します。しかし、それはまた、そのsubviewsで実行されているが、それ自体では処理されないタップジェスチャーを処理することになります。あなたのケースでは、ボタンはサブビューカテゴリの下にあります。superviewimageView)はこれらのイベントに応答していないため、タッチイベントはスクロールビューに移動します。

しかし、他のUIControlEvents、この場合UIScrollViewには、その応答superviewに渡されますので、現在、buttonだけのタッチイベントのUIControlEventTouchUpInsideタイプのためではなく、すべてのタッチイベントのために登録されています。

したがって、button handles all types of touch eventの場合は、superviewに処理するよう尋ねることはありません。

関連する問題