7

高さの異なるページを含む PDF を、一度に 1 ページずつ、ページ間に隙間なく、各ページの上部をビューの上部に揃えて、水平方向にページ形式で表示したいと考えています。例えば:

望ましいレンダリング

PDFKit特にこれらの設定は次のPDFView方法で実現できるため、を使用したいと思います。

let pdfView = PDFView()
pdfView.displayDirection = .horizontal
pdfView.displaysPageBreaks = false
pdfView.usePageViewController(true, withViewOptions: nil)

ただし、これにより次の結果が生成されます。

実際のレンダリング

これは、ページの高さが異なるためです。各ページは の垂直方向の中央に配置されPDFView、ページの高さがビューの高さよりも大きい場合 (ページ 2 など)、収まるように縦横比が調整されます。

最初の問題である垂直オフセットを解決するために、いくつかのことを試みました。まず、これは大雑把で、ビュー階層を調べてPDFTextInputView、ページがレンダリングされるプライベート ビュー ( という名前のクラスのビュー) を見つけた後、そのフレームorigin.y0最も外側のスクロールビュー (別のプライベート ビュー) がスクロールします。これは、次または前のページがビューにスクロールされるたびに、ページがビューの上部にレンダリングされるという点で機能します。ただし、ユーザーがそのページをピンチしてズームすると、そのフレームは自動的に中央に戻ります。このアプローチは、プライベート ビュー階層に依存することを除けば、うまくいきません。

「背の高いページの問題」(ページ 2) を解決するために、新しいページが表示されるたびに PDFView の倍率を調整してみました。悲しいことに、.PDFViewPageChanged通知はスクロール ビューの減速が終了したにのみ発生するため、スクロール イン時にページがズーム アウトされ、スケール ファクターを調整すると、画面の幅に合わせてジャンプします。次に.PDFViewVisiblePagesChanged、次/前のページが表示されると起動する に目を向けました (さらに数回、これで問題ありません)。これには と同じ問題があり.PDFViewPageChangedます。

私が試した他のこと:

  • transformドキュメント ビューの調整
  • ピンチ ジェスチャをインターセプトし、ドキュメント ビューの中心を調整する
  • 独自のページコントローラーを作成し、ページごとに 1 つの PDF ページをレンダリングします (を使用しないpdfView.usePageViewController)

私が求めているものをどのように達成できるかについて、誰かアイデアはありますか?

4

4 に答える 4

2

forceTopAlignment を true に設定するだけです

例:

lazy var pdfView: PDFView = {
    let pdf = PDFView()
    pdf.displayMode = .singlePageContinuous
    pdf.autoScales = true
    pdf.translatesAutoresizingMaskIntoConstraints = false
    pdf.setValue(true, forKey: "forcesTopAlignment")
    return pdf
}()

私の答えは受け入れられたものとどう違うのですか?

利用可能な pdfView の scrollView としてのプロパティはありません。したがって、pdfView に値を直接設定するだけです。

于 2020-09-11T14:23:49.313 に答える