You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动