skip to Main Content

I’ve been using the same PDFKit document view on a few apps, no issues. However on one view controller the PDFview seems to be shifted sideways by, what seems, to be 16px safe margin.

The PDFview is set to width of superview, and checking the PDFview size appears to correct (390px). But the x position, while stating is 0, seems to be 16px. This causes the pdf document to be wider than the screen causing horizontal scrolling.

I’ve tried disabling safe margins etc with no effect.
Interestingly none of the other elements (views) on the page are affected by this.

The view hierarchy is:
Vertical stack view – consisting of 3 subviews

  • Title stack view (horizontal)
  • info view (PDF view)
  • Tableview
  • Footer stack view (horizontal)

The Info and Table view occupy the same space, with one hidden depending on segment control.

Below are images of the hierarchy and the screen output, note the PDF document is shifted to the the right. It still has the full width of the screen, so it ‘overlaps’ on the right causing scrolling.

Never had this issue before and can’t seem to work out where the ‘margin’ is coming from and why only affecting the PDF view, but not the tableview.

The code:

// set PDf for Information layer in variable UIView
func pdfInfoDisplay() {
    
    infoView.backgroundColor = UIColor.white
    
    var pdfFull = pdfInfoObject
    
    pdfFull.append(".pdf")
    
    var pdfURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
    pdfURL = pdfURL.appendingPathComponent(pdfFull) as URL
   
    if let pdfDocument = PDFDocument(url: pdfURL) {

        infoView.autoresizesSubviews = true
        infoView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleTopMargin, .flexibleLeftMargin]
        infoView.displayDirection = .vertical
        infoView.pageShadowsEnabled = false

        infoView.autoScales = true
        infoView.displayMode = .singlePageContinuous
        infoView.displaysPageBreaks = true
        infoView.document = pdfDocument
        
        infoView.maxScaleFactor = 4.0
        infoView.minScaleFactor = infoView.scaleFactorForSizeToFit
    }
}

Storyboard

Screen output - note the right side indentation

2

Answers


  1. Chosen as BEST ANSWER

    Well, figured out the issue, by luck really.

    I setting up the pdf by calling its function from ‘viewDidLoad’.

    This, for some reason added ‘safe margin’ padding to the view even though I set constraints not to do this. No idea why.

    Problem was, the pdf view width was acting correctly, so was bigger than screen, as shifted by the safe margin. This lead to over hang of the pdf view causing horizontal scrolling.

    However by calling it from viewDidAppear meant that the constraints (no safe margin) I had set for the pdf view were as expected. The pdf view fitted within screen bounds. No overhang or horizontal scrolling.

    Overall, lesson learnt is that any sub views that have to be loaded in (this case presenting the pdf file) need to be called from viewDidAppear and not viewDidLoad.

    Hope this helps someone else


  2. Simple example for using PDFkit in Swift:

    import UIKit
    import PDFKit
    
    class ViewController: UIViewController {
    
        // Declare PDFView
        var pdfView: PDFView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Initialize PDFView
            pdfView = PDFView()
            pdfView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(pdfView)
    
            // Set constraints for PDFView
            NSLayoutConstraint.activate([
                pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
                pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
                pdfView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
                pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
            ])
    
            // Load PDF Document
            if let pdfURL = Bundle.main.url(forResource: "example", withExtension: "pdf"),
               let pdfDocument = PDFDocument(url: pdfURL) {
                pdfView.document = pdfDocument
                pdfView.autoScales = true
            } else {
                print("Error: PDF not found or unable to load.")
            }
        }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search