2

に通過するから、子ビューコントローラ上の未処理のタッチイベントを防止します。子ビューコントローラは、画面の一部にオーバーレイすることができます。そのルートビューは、不透明な背景色を提供するUIViewであり、これはUIScrollViewによってカバーされ、UIScrollViewはスタックビューなどの複雑なビュー階層を含む。は、私は付属のいくつかのジェスチャー認識装置で、独自のフルスクリーンコンテンツビューを管理するコンテナビューコントローラを持っているコンテナビュー

正しくスクロールし、ユーザーの操作そのサブビューを持つ。私が抱えている問題は、スクロールビューそのもの(つまり、サブビュー内ではない)上のタップやその他の非スクロールジェスチャーが、その背後にある空のUIViewに落ち、ルートビュー上のジェスチャー認識機能によって予期せず処理されることです親(コンテナ)コントローラの私はそれらのタッチが子供のバックグラウンドビューによって飲み込まれ、無視され/取り消されるようにしたい。

私が最初に考えたのはそれがスーパービューに渡すからタッチイベントを防止するであろうと仮定すると、nilを返すために、子供VCにnextResponderを上書きすることでした。そこでは成功しませんでしたので、私は子コントローラ上のタッチ操作メソッド(touchesBegan:など)をオーバーライドしようとしましたが、決して呼び出されることはありません。次に、単純なUIViewサブクラスを私の子コントローラのルートビューに置き換えました。同様に、両方のアプローチを同じように試みました。 nextResponderのnilもやはり何の効果もなく、touchメソッドが呼び出されることはありません。

マイレスポンダチェーンは、私が期待したとおりに設定されるようになります:スクロールビュー - >子VCのルートビュー - >子VC - >親のルートビュー - >親VC。それで私のコントローラーの封じ込めが正しく設定されていると思うし、親のルートビューのジェスチャーレコグナイザーが何とか私が理解していない方法でレスポンダーチェーンを勝ち抜いていると思わせる。

それは簡単なはずのようにこれはそうです。私は何が欠けていますか?ありがとう!

+0

あなたのもののグラフィック表現が役立つ、またはデモプロジェクト:)または数行のコード – Jageen

+0

子コントローラのルートビューとして「置換」されたUIViewに、ユーザーインタラクションが有効に設定されていることを確認してください –

+0

Thanks @SandeepBhandari、IバニラUIViewを使用しているときとサブクラスを使用しているときの両方でユーザー対話が有効になりました。私はそれをオフにして実験しました(チェーンを上ってから触れるのを防ぐために必要なことかもしれないと思っています)が、サブビューのすべて(スクロールビューなど)でユーザーのやり取りをやめます。 – 4bar

答えて

1

私はここにthis very helpful WWDC videoのおかげで何が起こっているかをよりよく理解すると思います。入ってくるタッチ考える

は、最初のシステムは、最も深いヒットテストビューでそのタッチを関連付けます。私の場合はそれがUIScrollViewです。それから、他のアタッチされたレコグナイザを探しているスーパービューの階層を上に戻っているように見えます。この動作は、ドキュメントのこのキービットによって暗示されています

ジェスチャー認識はタッチ特定のビューと、そのビューのサブビューの全てにヒットテストで動作します。

スクロールビューは認識されないタッチをキャンセルするか、おそらく前方に起こるレスポンダチェーンを触れないでください応答方法に頼るのいずれかの独自の内部パン認識(複数可)を、持っています。これは、私のレスポンダメソッドが呼び出されることがない理由を説明します。

この情報を武器に、私のような私の問題を解決するために、いくつかの可能な方法、と考えることができます:/場合は、関連するビューが子コントローラの下にあるときにタッチを無視する

  • 利用ジェスチャーデリゲートメソッド。
  • すべてのタッチをキャプチャして無視し、それを子コントローラのルートビューにアタッチする「ゼロ」ジェスチャ認識器サブクラスを記述します。

しかし、私がやってしまったことは私の子供のコントローラビューではなく、そのサブビューよりもメインコンテンツビューの兄弟になるように、上部に新しい空のビューで私のビュー階層を再配置するだけでした。

このからだから、ビュー階層の変更:これに

"Before" hierarchy

"After" hierarchy

これは私の問題を解決していない:私のジェスチャー認識装置は、もはやhit-あるタッチと対話子コントローラのビューに対してテストされます。そして、私はそれが、追加のロジックを必要とせずに、私のアプリのコントローラ間の概念関係をよりよく捕捉すると思う。

関連する問題