PDFを表示するビューがあります。ズーム可能にする必要があるため、UIScrollView も作成し、そのデリゲートに viewForZoomingInScrollView を実装して PDF ビューを返しました。ここまでは順調ですね。ただし、ユーザーがズームされた PDF ページの端に到達すると、次のページにめくります。簡単に聞こえますが、どうすればいいのかわかりません。
私はいくつかの異なるアプローチを試しました:
scrollViewDidScroll を使用して、スクロールが端に達したかどうかを検出します。ここでの問題は、zoomScale が 1 でスクロールできない場合、この関数が呼び出されないことです。しかし、UIScrollView は依然としてすべてのタッチ イベントを飲み込んでいるため、touchesMoved でエッジに到達したことも検出できません。ズームされていないときに canCancelContentTouches を NO に設定することはオプションではありません。
UIScrollView をサブクラス化し、タッチ イベントの一部を次のレスポンダーに転送します。残念ながら、UIScrollView がドラッグ操作を検出してタッチをキャンセルすると、UIScrollView サブクラスに対しても touchesMoved と touchesEnded が呼び出されなくなりました。繰り返しますが、canCancelContentTouches を NO に設定するのは良くありません。これは、必要な UIScrollView 機能の一部を妨げることにもなります。
スクロール ビューの上に (その兄弟として) 透明なビューを作成し、このビューが最初にすべてのタッチ イベントを取得してから、タッチの一部をスクロール ビューに転送します。残念ながら、スクロール ビューはこれらの呼び出しに応答しません。
実際のタッチを引数として取得しないため、touchesShouldCancelInContentView を使用できません。また、スクロール ビューでタッチ イベントを処理するかどうかは、タッチ イベント自体のプロパティにも依存します (例: タッチの動き)。すでに端にいる方向は、スクロール ビューによってキャンセルされるべきではありませんが、他の方向への移動はキャンセルされる可能性があります)。
UIScrollView が行っていることは、touchesBegan / touchesMoved から開始されていないように見えますが、その前にタッチに関する通知を受け取ります。おそらく、傍受も再現もできない文書化されていない方法で。
UIScrollView で行われたすべてのタッチ動作について通知を受ける方法はありますが、(特定の条件が適用される場合) UIScrollView をズームとスクロールに使用できますか?