cyj89317
cyj89317

Reputation: 85

Swift PDFKit - How to scroll to specific point programmatically?

I have vertical scrolling PDFView:

var pdfView = PDFView()

pdfView.displayDirection = .vertical
pdfView.usePageViewController(false)
pdfView.pageBreakMargins = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
pdfView.autoScales = true
pdfView.backgroundColor = .black

I can scroll and zoom the pdf file.

But how can I scroll pdfView programmatically?

pdfView.go(to: someCGRect, on: somePage)

I tried
go(to:, on:), but it just jumps to that point and page without scrolling.

go(to: PDFPage) scrolls, but just to the specified page.

Reference: https://developer.apple.com/documentation/pdfkit/pdfview/navigation

Upvotes: 4

Views: 1046

Answers (1)

geohei
geohei

Reputation: 802

What I did.

Create the following global variables:

var savedPDFViewScaleFactor: CGFloat? = nil
var savedPDFViewRect: CGRect? = nil
var savedPDFViewPageIndex: Int? = nil

Save PDFView attributes values for future return:
viewWillDisappear(_ animated:)

savedPDFViewScaleFactor = pdfView.scaleFactor
savedPDFViewRect = pdfView.convert(pdfView.bounds, to: pdfView.currentPage!)
savedPDFViewPageIndex = pdfView.document?.index(for: pdfView.currentPage!)

Retrieve and apply saved values to existing PDFView:

 // set scale factor (initial or saved)
pdfView.scaleFactor = savedPDFViewScaleFactor ?? 2.0

// set page for pdfView.go(to:on:) (initial or saved)
let pageIndex = savedPDFViewPageIndex ?? 0 // set pageIndex to 0 if savedPDFViewPageIndex doesn't exist yet
let page = document.page(at: pageIndex) ?? document.page(at: 0)! // set page to saved page or page 0 if it doesn't exist yet

// set rect for pdfView.go(to:on:) (initial or saved)
var rect: CGRect
let pageSize = page.bounds(for: .mediaBox).size
let pageWidth = pageSize.width
let pageHeight = pageSize.height
if page.rotation == 0 { // 0 = portrait ; 270 = landscape
    rect = CGRect(origin: CGPoint(x: 0.0, y: pageHeight), size: CGSizeZero) // for portrait
} else {
    rect = CGRect(origin: CGPoint(x: pageWidth, y: pageHeight), size: CGSizeZero) // for landscape
}
rect = savedPDFViewRect ?? rect // set rectangle for pdfView.go(to:on:) (initial or saved)

// present pdf
pdfView.go(to: rect, on: page)

Upvotes: 0

Related Questions