iOS PDFKit 未填充 UIView

iOS PDFKit not filling UIView

我正在使用 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

只需在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

好的,首先非常感谢 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

        }
    } 
}

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

我一直在努力解决类似的问题,以及 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 都存在时才有效。

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

pdfView.maxScaleFactor = 4.0 
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit

先设置minScaleFactor,再设置scaleFactor,必须在minScaleFactormaxScaleFactor之间。

运行 一个调试,并改变这个值直到你得到最适合你的尺寸。

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)
}