【问题标题】:iOS PDFKit not filling UIViewiOS PDFKit 没有填充 UIView
【发布时间】:2018-10-17 21:32:07
【问题描述】:

我正在使用 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.autoresizesSubviews = true pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleTopMargin, .flexibleLeftMargin]

标签: ios uiview scale pdfkit pdfview


【解决方案1】:

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

总体而言,要设置 pdf 以填充视图,我需要设置 autoresizing 和 autoscales BEFORE

pdfView.document = pdfDocument

然后控制缩放,设置这些 AFTER

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

        }
    } 
}

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

【讨论】:

  • Nicholas Farmer 可以为我检查以下示例并为我提供解决方案,在这里我也想做同样的事情。链接-github.com/MallikarjunH/TestPDFFullScreen1.git
  • 在我的代码/要求中需要显示单页,即 pdfView.displayMode = .singlePage
  • 亲爱的 MK,抱歉我没有时间下载和查看。使用所有代码作为单独的问题发布
  • Nicholas Farmer - 这是新问题链接 - stackoverflow.com/questions/66219028/…
【解决方案2】:

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

【讨论】:

  • 嘿,我想在固定尺寸视图中显示我的 pdf。
  • 嗨,Ekta,您是否考虑过将 PDFView 放入自定义 UIScrollView 中?这就是我所做的,而且我对它有更多的控制权。
【解决方案3】:

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

【讨论】:

  • 感谢您的输入,很遗憾这不起作用。我只是得到一个空白屏幕(在标题下方)。仅供参考,我在 Storyboard 中的视图层次结构是:View - PDFView
  • 请分享你的故事板层次结构。
  • 如果您使用 UIView 并且在该 pdfview 内部,那么您可以更改 pdfview = PDFView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame .height)) 到 pdfview = PDFView(frame: CGRect(x: 0, y: 0, width: yourView.frame.width, height: yourView.frame.height))
  • 嗨,Mahesh,抱歉延迟休息,我无法使用我的电脑。不幸的是,这不起作用。在上面发表评论之前,我实际上已经尝试过,但又累了,没有效果。我还尝试从 pdfView 中删除约束,但没有效果。如果有任何进一步的帮助,我将不胜感激,我很想给你赏金!
  • @MaheshShahane 嘿,你能帮帮我吗?
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    首先设置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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      相关资源
      最近更新 更多