だからここに契約があります:
- コンテンツが境界の高さよりも高いコレクション ビュー (サブビュー) を持つビューがあります。したがって、コレクション ビューでは、垂直方向にスクロールしてそのすべてのアイテムを表示できます。
- また、このコレクション ビューはおよそ配置されます。スーパービュー (VC メイン ビュー) の下部を超えた高さの半分。つまり、コレクション ビューの半分が画面の下部を越えて「隠されている」ということです。
- コレクションビューを上下にドラッグできるようにするために、UIKit Dynamics を使用しています。静止位置は 2 で説明したとおりです。「拡張」位置は、VC のナビゲーション バーまでずっとです。
ダイナミクスをトリガーするために、UIPanGestureRecognizer をメインの vc ビュー (コレクション ビューのスーパービュー) にアタッチし、コレクション ビューがある場所でドラッグが開始されたことを検出すると、ダイナミクス プロセスを開始してプルアップまたはダウンします。
ただし、私が達成しようとしている動作は次のとおりです。
- コレクション ビューが折りたたまれている場合 (下)、ドラッグするとダイナミクスを介して引き上げられますが、コレクション ビューのパン レコグナイザーが同時にスクロールすることはできません。
- コレクション ビューを引き上げるという点で目標の高さに達すると、コレクション ビューもジェスチャに反応し始め、コレクション ビュー内で垂直方向にスクロールします。このコレクション ビューへの切り替えは、ジェスチャにも応答するため、継続的である必要があります。つまり
scrollEnabled
、スーパービュー内の位置に応じてコレクション ビューを設定すると、これは機能しません。ジェスチャは既に処理中であるため、現在のジェスチャを終了して新しいジェスチャを開始するまで、コレクション ビューはスクロールを開始しません。
コレクション ビューのジェスチャ レコグナイザーに、ジェスチャが進行中であることを認識させ、スーパービュー レコグナイザーによって既に処理されているにもかかわらず、そのジェスチャの認識を開始させる方法はありますか?
アップデート:
この時点で、ネストされた 2 つのスクロールビューを使用するソリューションに落ち着きます。誰かが興味を持っているなら、私は試みで小さなプロジェクトを作りました. それはまだ受け入れられません。ネストされたスクロールビュー アプローチの主な問題は次のとおりです。
- デフォルトでは、進行中のジェスチャにスクロールビュー (およびサブクラス) が応答しないという問題は、
scrollEnabled
2 つのスクロール ビューまたはジェスチャ レコグナイザーとスクロール ビューの処理に関係なく、YES に設定されています。 - 問題のクラス (この例では、1 つのテーブル ビューと 1 つのスクロールビュー) をサブクラス化し、
scrollEnabled
プロパティを操作し-setContentOffset:
てビューのレコグナイザーを同時に認識するように設定することで、これを解決しました。この時点で、最終的にスクロールビュー (またはそのサブクラス) をscrollEnabled
任意に設定し、進行中のジェスチャーに応答させることができます。
しかし、私は他のいくつかの問題に直面しています:
- ビューをYESに設定する前にジェスチャがしばらく続いているかどうかに応じて
scrollEnabled
、ビューはコンテンツオフセットを正しくない値に設定するメッセージを受け取り始めます。つまり、親スクロール ビューが最大コンテンツ オフセットに達するまでテーブル ビューのスクロールが無効になっている場合、ジェスチャがまだ進行中にジェスチャに応答するためにテーブル ビューをオンにすると、親ビューの contentOffset ではなく親ビューの contentOffset にスクロールしようとします。 0 からの次のステップの値 (コンテンツ オフセットが実際にはこの時点まで 0 であるため)。 - ジェスチャが、親スクロールビューの最大オフセットを超えて上に連続的にパンしてから再び下に戻すか、または代わりに 2 つの個別のスワイプ (上に 1 つ、下に 1 つ) であるかによって、異なるオフセット結果も得られます。
- コンテンツ オフセットが <= 0 になるポイントまでテーブルビューを引き下げ、親ビューで再びスクロールを有効にすると、値を 0 に丸めたとしても、テーブルビューがコンテンツ オフセット 0 に完全に整列するとは限りません。 0.