Swift中如何创建单页垂直滚动的PDFView?
正确实现iOS单页垂直滚动的PDFView方案
我看了你这段实现PDF垂直滚动的代码,确实能正常显示,但核心问题在于你用了usePageViewController(true)——这个API本质是基于UIPageViewController实现整页翻页效果,哪怕设置了displayDirection = .vertical,也不是真正的单页平滑垂直滚动。下面给你调整后的精准实现方案,顺便解决常见的适配坑:
修正后的完整代码
import UIKit import PDFKit class YourViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupVerticalSinglePagePDFView() } private func setupVerticalSinglePagePDFView() { // 初始化PDFView并适配父视图 let pdfView = PDFView(frame: view.bounds) pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight] pdfView.backgroundColor = .white // 核心配置:实现单页垂直滚动 pdfView.displayDirection = .vertical // 设置垂直方向 pdfView.displayMode = .singlePage // 强制单页显示,避免多页并排 pdfView.usePageViewController(false, withViewOptions: nil) // 关闭翻页模式,启用滚动模式 pdfView.autoScales = true // 自动缩放适配屏幕宽度 // 加载PDF文档 let documentName = "test" guard let documentURL = Bundle.main.url(forResource: documentName, withExtension: "pdf"), let document = PDFDocument(url: documentURL) else { print("Failed to load PDF: \(documentName).pdf") return } pdfView.document = document view.addSubview(pdfView) } }
关键修改点说明
- 关闭
PageViewController:把usePageViewController(true)改成false,让PDFView切换到基于UIScrollView的平滑滚动模式,而不是整页翻页 - 强制单页显示:添加
displayMode = .singlePage,确保滚动过程中始终只展示一页内容,不会出现多页叠加/并排的情况 - 自适应尺寸:设置
autoresizingMask,让PDFView在屏幕旋转、父视图尺寸变化时自动调整大小,避免内容截断 - 自动缩放适配:开启
autoScales,让PDF内容自动适配屏幕宽度,无需手动计算缩放比例
可选进阶配置
如果需要更精细化的控制,可以添加以下设置:
- 禁用缩放:
pdfView.maxScaleFactor = 1.0+pdfView.minScaleFactor = 1.0 - 用Auto Layout替代Frame(更适配现代iOS开发):
pdfView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(pdfView) NSLayoutConstraint.activate([ pdfView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), pdfView.leadingAnchor.constraint(equalTo: view.leadingAnchor), pdfView.trailingAnchor.constraint(equalTo: view.trailingAnchor), pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ])
内容的提问来源于stack exchange,提问作者Jeremie




