【发布时间】:2021-01-12 06:29:30
【问题描述】:
我正在为 iPad 创建一个 PDF 查看器,用户可以使用它通过水平滚动来阅读 PDF。
我创建了以下代码来实现单页面视图,并通过手势更改页面(同时咨询How to create a single page vertical scrolling PDFView in Swift 和其他地方)。
虽然这种方法在大多数情况下都可以正常工作,但我意识到放大 PDF 文件时不会检测到(或调用)手势。因此,我无法通过滑动屏幕转到下一页。使用我创建的 extension PDFView {} 函数,我发现禁用subview 中的用户交互使我能够检测到滑动手势。但是,现在我无法滚动 PDFView 内的页面。如果您能帮我弄清楚如何解决这个问题,我将不胜感激。
我想要实现的是类似于PDF Expert (https://apps.apple.com/us/app/pdf-expert-pdf-reader-editor/id743974925),我可以在其中水平滚动到下一页。
非常感谢您提前提供的帮助!
import UIKit
import PDFKit
//PDF Zoom scale
var scaleOfPdf: CGFloat = 4
extension PDFView {
func disableBouncing(){
for subview in subviews{
if let scrollView = subview as? UIScrollView{
scrollView.bounces = false
return
}
}
class ViewController: UIViewController, UIGestureRecognizerDelegate, UIDocumentPickerDelegate {
@IBOutlet weak var pdfView: PDFView!
override func viewDidLoad(){
super.viewDidLoad()
pdfView.autoresizesSubviews = true
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleTopMargin, .flexibleLeftMargin]
pdfView.displayDirection = .horizontal
pdfView.displayMode = .singlePage
pdfView.autoScales = true
// setting a color for background
pdfView.backgroundColor = .black
pdfView.document = pdfDocument
// pdfView.usePageViewController(true, withViewOptions: [UIPageViewController.OptionsKey.interPageSpacing: 20])
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
pdfView.disableBouncing()
//setting swipe gesture
let leftSwipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(respondLeftSwipeGesture(_:)))
leftSwipeGesture.direction = [UISwipeGestureRecognizer.Direction.left]
pdfView.addGestureRecognizer(leftSwipeGesture)
let rightSwipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(respondRightSwipeGesture(_:)))
rightSwipeGesture.direction = [UISwipeGestureRecognizer.Direction.right]
pdfView.addGestureRecognizer(rightSwipeGesture)
}
//setting swipe-gesture
@objc func respondLeftSwipeGesture(_ sender: UISwipeGestureRecognizer) {
print("left swipe was detected")
if pdfView.document == nil { return }
scaleOfPdf = pdfView.scaleFactor
pdfView.goToNextPage(self)
pdfView.scaleFactor = scaleOfPdf
}
@objc func respondRightSwipeGesture(_ sender: UISwipeGestureRecognizer) {
print("right swipe was detected")
if pdfView.document == nil { return }
scaleOfPdf = pdfView.scaleFactor
pdfView.goToPreviousPage(self)
pdfView.scaleFactor = scaleOfPdf
}
}
【问题讨论】:
标签: ios swift uiscrollview uigesturerecognizer pdfview