Reputation: 85
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
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