PDFKitを使用して単純なPDFを表示しています。 UIView内の画面に表示するときは、以下のコードを使用しました。
目的:-ビューを埋めるためにコンテンツから始めます-画面全体の幅を賢く埋めたい
override func viewDidLoad() {
super.viewDidLoad()
if let path = Bundle.main.path(forResource: "Disclaimer", ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView.document = pdfDocument
pdfView.autoScales = true
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
pdfView.displayMode = .singlePageContinuous
pdfView.displaysPageBreaks = false
}
}
self.view.backgroundColor = UIColor.black
}
ストーリーボードでは、UIviewが画面の全幅を埋めるように制約を設定しました。
autoscale
sales PDFドキュメントを画面の幅よりも小さくすると、基本的にpdfの周囲にマージンが追加されます。ズームインしてPDFを画面全体に表示させることができます。オーバーフローしてスクロールバーが機能する前に。
倍率を手動で設定すると、1ページを作成できますPDF画面の幅全体に表示されますが、PDFに複数のページがある場合は、幅は、margin
が存在する場合に画面幅よりも小さくなります。
最終的には、画面幅全体をPDFで、マージン/ギャップなしで埋めたいだけです。
助けていただければ幸いです。
更新:以下のアドバイスに従って使用されるコード-しかし現在は機能していません:
if let path = Bundle.main.path(forResource: pdfObject, ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView = PDFView(frame: CGRect(x: 0, y: 0, width: pdfView.frame.width, height: pdfView.frame.height))
pdfView.document = pdfDocument
}
}
注:pdfViewは、PDFViewである私のUIViewです。
そうです、まずマヘシュに感謝します。彼の答えは私の質問に直接答えませんでしたが、彼らが言った2つのことはこれを解決するための道を提供しました。
全体的に、ビュー全体にPDFを設定するには、前に自動サイズ変更と自動スケールを設定する必要がありました
pdfView.document = pdfDocument
そして、ズームを制御するには、これらを後で設定します
pdfView.document = pdfDocument
したがって、私の最終的なコードは次のとおりです。
func pdfDisplay() {
if let path = Bundle.main.path(forResource: pdfObject, ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView.autoresizesSubviews = true
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleTopMargin, .flexibleLeftMargin]
pdfView.displayDirection = .vertical
pdfView.autoScales = true
pdfView.displayMode = .singlePageContinuous
pdfView.displaysPageBreaks = true
pdfView.document = pdfDocument
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
}
}
}
うそをつくつもりはありません、なぜこれがこの順序で機能するのかわかりません、私よりも賢い心からのコメントをいただければ幸いですが、これが他の人に役立つことを願っています
_pdfView.document = pdfDocument
_の前にpdfview = PDFView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
を使用するだけです
そして、これらの行を削除します:
_pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
_
私は同様の問題と、autoScalesの非常に奇妙で一貫性のない動作に苦しんでいます。私の場合、自動スケーリングは最初にロードされたドキュメントで機能しましたが、同じpdfView内の後続のロードされたドキュメントでは機能しなかったか、2番目にロードされたドキュメントからのみ機能しました。
ジェスチャの動作をより細かく制御するために、pdfViewをUIScrollViewに埋め込みました。
コマンドの順序は確かに重要なようです。多くの試行錯誤の末、これが私にとって最も効果的な順序です。
ドキュメントをロードします
pdfView.document = pdfDocument
表示モードを設定する
pdfView.displayMode = .singlePage
制約、背景、影などを設定します。
制約を変更してpdfViewサイズを変更する
AutoScalesを設定する
pdfView.autoScales = true
スケールファクターを設定する
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
これは私の場合すべてが機能した唯一の順序であり、ステージ2、5、および6がすべて存在する場合にのみ機能しました。
viewDidLoad()
にpdfView
を設定し、これをviewDidLayoutSubviews()
に配置します。
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
最初にminScaleFactor
を設定し、次にscaleFactor
を設定します。これはminScaleFactor
とmaxScaleFactor
の間にある必要があります。
デバッグを実行し、最適なサイズになるまでこの値を変更します。
func showPDF(_ dataStr:String){
guard let data = Data(base64Encoded: dataStr) else { return }
let pdfView = PDFView(frame: self.view.bounds)
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
pdfView.autoScales = true
pdfView.displayMode = .singlePageContinuous
pdfView.displaysPageBreaks = true
pdfView.document = PDFDocument(data:data)
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = 1.15
pdfView.scaleFactor = 1.15
self.view.addSubview(pdfView)
}