So in the end I thought of 3 solutions, neither of them is perfect. I like solution 3 the most.
SOLUTION 1: not stable, is failing to render pdf from time to time or launches not on the 1st page. But most often works fine.
lazy var pdfView: PDFView = {
let view = PDFView().layoutable()
view.displayMode = .twoUpContinuous
view.autoScales = false
view.displayDirection = .vertical
return view
}()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
updatePDFViewScaling()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
updatePDFViewScaling()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
updatePDFViewScaling()
}
private func updatePDFViewScaling() {
customView.pdfView.displayMode = .twoUp
let scaleFactor = customView.pdfView.scaleFactorForSizeToFit
customView.pdfView.displayMode = .twoUpContinuous
customView.pdfView.scaleFactor = scaleFactor
customView.pdfView.minScaleFactor = scaleFactor
customView.pdfView.maxScaleFactor = 3
}
SOLUTION 2: horizontally perfect, vertically not. Width of 2 PDFs fits, however the bottom is cropped. In case of A4 documents, that should crop not too much on most iPads, because all of them have the aspect ratio of 3:4.
lazy var pdfView: PDFView = {
let view = PDFView().layoutable()
view.displayMode = .twoUpContinuous
view.displayDirection = .vertical
view.minScaleFactor = view.scaleFactorForSizeToFit
view.maxScaleFactor = 3
return view
}()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
customView.pdfView.autoScales = true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
customView.pdfView.autoScales = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
customView.pdfView.autoScales = true
}
SOLUTION 3: There is no animation when you scroll with your finger to the next/previous page INSIDE PDF.
lazy var pdfView: PDFView = {
let view = PDFView().layoutable()
view.displayMode = .twoUp
view.displayDirection = .vertical
view.minScaleFactor = view.scaleFactorForSizeToFit
view.maxScaleFactor = 3
view.autoScales = true
return view
}()
// somewhere in view's init or wherever you want
let upGestureRegocnizer = UISwipeGestureRecognizer(target: self, action: #selector(upSwipeAction(gestureRegonizer:)))
upGestureRegocnizer.direction = .up
pdfView.addGestureRecognizer(upGestureRegocnizer)
let downGestureRegocnizer = UISwipeGestureRecognizer(target: self, action: #selector(downSwipeAction(gestureRegonizer:)))
downGestureRegocnizer.direction = .down
pdfView.addGestureRecognizer(downGestureRegocnizer)
@objc private func upSwipeAction(gestureRegonizer: UISwipeGestureRecognizer) {
guard pdfView.canGoToNextPage else { return }
pdfView.goToNextPage(self)
}
@objc private func downSwipeAction(gestureRegonizer: UISwipeGestureRecognizer) {
guard pdfView.canGoToPreviousPage else { return }
pdfView.goToPreviousPage(self)
}