に通過するから、子ビューコントローラ上の未処理のタッチイベントを防止します。子ビューコントローラは、画面の一部にオーバーレイすることができます。そのルートビューは、不透明な背景色を提供するUIViewであり、これはUIScrollViewによってカバーされ、UIScrollViewはスタックビューなどの複雑なビュー階層を含む。は、私は付属のいくつかのジェスチャー認識装置で、独自のフルスクリーンコンテンツビューを管理するコンテナビューコントローラを持っているコンテナビュー
正しくスクロールし、ユーザーの操作そのサブビューを持つ。私が抱えている問題は、スクロールビューそのもの(つまり、サブビュー内ではない)上のタップやその他の非スクロールジェスチャーが、その背後にある空のUIViewに落ち、ルートビュー上のジェスチャー認識機能によって予期せず処理されることです親(コンテナ)コントローラの私はそれらのタッチが子供のバックグラウンドビューによって飲み込まれ、無視され/取り消されるようにしたい。
私が最初に考えたのはそれがスーパービューに渡すからタッチイベントを防止するであろうと仮定すると、nilを返すために、子供VCにnextResponder
を上書きすることでした。そこでは成功しませんでしたので、私は子コントローラ上のタッチ操作メソッド(touchesBegan:
など)をオーバーライドしようとしましたが、決して呼び出されることはありません。次に、単純なUIViewサブクラスを私の子コントローラのルートビューに置き換えました。同様に、両方のアプローチを同じように試みました。 nextResponderのnilもやはり何の効果もなく、touchメソッドが呼び出されることはありません。
マイレスポンダチェーンは、私が期待したとおりに設定されるようになります:スクロールビュー - >子VCのルートビュー - >子VC - >親のルートビュー - >親VC。それで私のコントローラーの封じ込めが正しく設定されていると思うし、親のルートビューのジェスチャーレコグナイザーが何とか私が理解していない方法でレスポンダーチェーンを勝ち抜いていると思わせる。
それは簡単なはずのようにこれはそうです。私は何が欠けていますか?ありがとう!
あなたのもののグラフィック表現が役立つ、またはデモプロジェクト:)または数行のコード – Jageen
子コントローラのルートビューとして「置換」されたUIViewに、ユーザーインタラクションが有効に設定されていることを確認してください –
Thanks @SandeepBhandari、IバニラUIViewを使用しているときとサブクラスを使用しているときの両方でユーザー対話が有効になりました。私はそれをオフにして実験しました(チェーンを上ってから触れるのを防ぐために必要なことかもしれないと思っています)が、サブビューのすべて(スクロールビューなど)でユーザーのやり取りをやめます。 – 4bar