9

我正在使用 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销售小于屏幕宽度的PDF文档,它基本上在pdf周围添加了一个边距。我可以放大并让他的 Pdf 填满整个屏幕,在它溢出和滚动条发挥作用之前。

如果我手动设置比例因子,我可以使单页 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 是我的 UIView 即 PDFView

4

5 回答 5

10

对,首先非常感谢 Mahesh。虽然他的回答没有直接回答我的问题,但他们所说的两件事确实提供了解决这个问题的途径。

总体而言,要设置 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

        }
    } 
}

不会撒谎,我不确定为什么按这个顺序工作,我希望比我更聪明的人发表评论,但我希望这对其他人有帮助

于 2018-10-28T20:00:40.697 回答
4

我一直在努力解决类似的问题,以及 autoScales 的非常奇怪和不一致的行为。在我的例子中,自动缩放要么对第一个加载的文档起作用,但对同一个 pdfView 中的任何后续加载文档都不起作用,或者它只对第二个加载的文档起作用。

我已将 pdfView 嵌入到 UIScrollView 中,以便更好地控制手势行为。

命令的顺序似乎确实是关键。经过大量的试验和错误,这是最适合我的顺序:

  1. 加载文档

    pdfView.document = pdfDocument

  2. 设置显示模式

    pdfView.displayMode = .singlePage

  3. 设置任何约束、背景、阴影等。

  4. 通过修改约束对 pdfView 大小进行更改

  5. 设置自动缩放

    pdfView.autoScales = true

  6. 设置比例因子

    pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit

这是在我的案例中一切正常的唯一顺序,并且仅在第 2、5 和 6 阶段都存在时才有效。

于 2019-03-11T22:04:34.143 回答
2

pdfview = PDFView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))之前用过pdfView.document = pdfDocument

并删除这些行:

pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
于 2018-10-26T11:08:47.827 回答
2

设置输入pdfView并将viewDidLoad()其放入viewDidLayoutSubviews()

pdfView.maxScaleFactor = 4.0 
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
于 2019-12-01T19:29:16.003 回答
0

首先是 set minScaleFactor,然后是 set 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)
}
于 2020-01-28T21:43:32.323 回答