iOS中使用PDFKit滚动多页PDF时页面指示器不显示问题求助
iOS PDFKit 页面指示器不显示的解决方法
PDFKit 的 PDFView 默认没有内置页面指示器,要实现类似「文件」App 的页码显示效果,需要手动添加 UIPageControl 并与 PDFView 的页面状态同步,具体步骤如下:
实现步骤
添加核心控件
在视图控制器中声明PDFView(用于展示PDF)和UIPageControl(用于显示页码)。配置 PDFView 基础属性
设置布局、显示模式和缩放行为,确保符合滚动浏览需求。配置页码指示器样式
固定指示器位置在视图底部居中,设置选中/未选中状态的颜色。监听页面变化事件
通过PDFView.layoutChangedNotification监听页面切换,实时更新指示器状态。
完整代码示例
import PDFKit import UIKit class PDFViewController: UIViewController { private let pdfView = PDFView() private let pageControl = UIPageControl() override func viewDidLoad() { super.viewDidLoad() setupPDFView() setupPageControl() setupPageChangeObserver() loadTargetPDF() } /// 配置PDFView基础属性 private func setupPDFView() { pdfView.frame = view.bounds pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // 设置连续滚动模式,和文件App一致 pdfView.displayMode = .singlePageContinuous pdfView.autoScales = true view.addSubview(pdfView) } /// 配置页码指示器样式与布局 private func setupPageControl() { pageControl.translatesAutoresizingMaskIntoConstraints = false view.addSubview(pageControl) // 固定在安全区底部居中 NSLayoutConstraint.activate([ pageControl.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20), pageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor) ]) pageControl.pageIndicatorTintColor = .lightGray pageControl.currentPageIndicatorTintColor = .systemBlue } /// 监听PDF页面变化 private func setupPageChangeObserver() { NotificationCenter.default.addObserver( self, selector: #selector(updatePageControlState), name: PDFView.layoutChangedNotification, object: pdfView ) } /// 更新页码指示器状态 @objc private func updatePageControlState() { guard let document = pdfView.document else { return } pageControl.numberOfPages = document.pageCount // PDF页面编号从1开始,UIPageControl从0开始,需转换索引 let currentPageNum = pdfView.currentPage?.pageNumber ?? 1 pageControl.currentPage = currentPageNum - 1 } /// 加载目标PDF文件 private func loadTargetPDF() { // 替换为你的PDF文件路径,示例从Bundle加载 guard let pdfURL = Bundle.main.url(forResource: "sample", withExtension: "pdf") else { print("PDF文件不存在") return } pdfView.document = PDFDocument(url: pdfURL) } deinit { // 移除通知监听,避免内存泄漏 NotificationCenter.default.removeObserver(self) } }
补充说明
- 若需要双页显示效果,可将
displayMode设置为.twoUpContinuous,页码指示器会自动适配总页数。 - 如需支持点击指示器跳转页面,可给
pageControl添加valueChanged事件,通过pdfView.go(to:)方法跳转到指定页面。
内容的提问来源于stack exchange,提问作者Daniel Frost
相关产品推荐
相关产品推荐

