2

PDFを表示するビューがあります。ズーム可能にする必要があるため、UIScrollView も作成し、そのデリゲートに viewForZoomingInScrollView を実装して PDF ビューを返しました。ここまでは順調ですね。ただし、ユーザーがズームされた PDF ページの端に到達すると、次のページにめくります。簡単に聞こえますが、どうすればいいのかわかりません。

私はいくつかの異なるアプローチを試しました:

  1. scrollViewDidScroll を使用して、スクロールが端に達したかどうかを検出します。ここでの問題は、zoomScale が 1 でスクロールできない場合、この関数が呼び出されないことです。しかし、UIScrollView は依然としてすべてのタッチ イベントを飲み込んでいるため、touchesMoved でエッジに到達したことも検出できません。ズームされていないときに canCancelContentTouches を NO に設定することはオプションではありません。

  2. UIScrollView をサブクラス化し、タッチ イベントの一部を次のレスポンダーに転送します。残念ながら、UIScrollView がドラッグ操作を検出してタッチをキャンセルすると、UIScrollView サブクラスに対しても touchesMoved と touchesEnded が呼び出されなくなりました。繰り返しますが、canCancelContentTouches を NO に設定するのは良くありません。これは、必要な UIScrollView 機能の一部を妨げることにもなります。

  3. スクロール ビューの上に (その兄弟として) 透明なビューを作成し、このビューが最初にすべてのタッチ イベントを取得してから、タッチの一部をスクロール ビューに転送します。残念ながら、スクロール ビューはこれらの呼び出しに応答しません。

  4. 実際のタッチを引数として取得しないため、touchesShouldCancelInContentView を使用できません。また、スクロール ビューでタッチ イベントを処理するかどうかは、タッチ イベント自体のプロパティにも依存します (例: タッチの動き)。すでに端にいる方向は、スクロール ビューによってキャンセルされるべきではありませんが、他の方向への移動はキャンセルされる可能性があります)。

UIScrollView が行っていることは、touchesBegan / touchesMoved から開始されていないように見えますが、そのにタッチに関する通知を受け取ります。おそらく、傍受も再現もできない文書化されていない方法で。

UIScrollView で行われたすべてのタッチ動作について通知を受ける方法はありますが、(特定の条件が適用される場合) UIScrollView をズームとスクロールに使用できますか?

4

1 に答える 1

0

わかりましたので、これが私が最終的にやったことです:

  • すべてのスクロールとズームアップを UIScrollView に残し、UIScrollViewDelegate の scrollViewDidEndDragging:willDecelerate: でページめくりを処理することは、ほぼ解決策ですが、コンテンツ全体が画面上にある場合はこの関数が呼び出されないため、ドラッグ/スクロールはできません。
  • この場合のスワイプは、ViewController の touchesBegan / touchesEnded 関数で処理されますが、これが機能するには、UIScrollView がこれらのイベントをキャンセルしないようにする必要があります。ただし、それ以外の場合、UIScrollView はタッチをキャンセルして、ズームとスクロールを実行できるようにする必要があります。
  • UIScrollView は、次の場合にタッチをキャンセルできる必要があります。
    • コンテンツ全体が画面に収まらないため (私の場合は zoomScale > 1)、スクロールが可能 (かつ必要)、または
    • ユーザーは 2 本の指で画面に触れたので、ズームインとズームアウトが機能します。
  • スクロールが不可能で、ユーザーが画面にシングルタッチした場合、タッチはキャンセルされず、タッチ イベントはビュー コントローラーに転送される必要があります。

  • そこで、UIScrollView サブクラスを作成しました。

  • このサブクラスには、ViewController を指すプロパティがあります。
  • touchesXXX メソッドを使用して、現在のタッチ数を追跡します。
  • すべてのタッチ イベントを ViewController に転送します。
  • 最後に、touchesShouldCancelInContentView: をオーバーライドし、zoomScale <= 1 かつ touchCount == 1 の場合は NO を返します。
于 2010-06-04T10:18:26.477 に答える