iOS开发:如何检测PDFView页面滑动并隐藏PDFThumbnailView?
解决PDFView滑动翻页时隐藏PDFThumbnailView的问题
哈哈,我懂你的困扰!确实PDFViewDelegate里没有直接提供页面滑动开始/结束的回调方法,但咱们可以通过两种靠谱的方式实现需求:
方法一:用KVO监听currentPage的变化
当用户滑动翻页时,PDFView的currentPage属性肯定会更新,我们可以通过键值观察(KVO)来捕捉这个变化,然后触发隐藏缩略图的操作:
- 先在视图控制器的
viewDidLoad里添加上监听:
override func viewDidLoad() { super.viewDidLoad() // 假设你的PDFView实例叫pdfView,缩略图视图是thumbnailView pdfView.addObserver(self, forKeyPath: "currentPage", options: [.old, .new], context: nil) }
- 然后实现KVO的回调方法:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard keyPath == "currentPage", let newPage = change?[.newKey] as? PDFPage, let oldPage = change?[.oldKey] as? PDFPage, newPage != oldPage else { return } // 确认是切换到了新页面,直接隐藏缩略图 thumbnailView.isHidden = true }
- 别忘了在控制器销毁时移除监听,避免内存泄漏:
deinit { pdfView.removeObserver(self, forKeyPath: "currentPage") }
方法二:监听UIPageViewController的页面切换通知
既然你开启了usePageViewController(true, withViewOptions: nil),PDFView内部其实是用UIPageViewController来管理页面切换的,我们可以监听它的过渡完成通知:
- 同样在
viewDidLoad里注册通知:
override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(onPageDidFinishAnimating), name: NSNotification.Name.UIPageViewControllerDidFinishAnimating, object: nil ) }
- 实现通知的处理方法:
@objc func onPageDidFinishAnimating(notification: NSNotification) { guard let pageVC = notification.object as? UIPageViewController, pageVC.parent === pdfView else { // 过滤掉其他页面控制器的通知 return } // 确认是当前PDFView的页面切换,隐藏缩略图 thumbnailView.isHidden = true }
- 销毁时记得移除通知监听:
deinit { NotificationCenter.default.removeObserver(self) }
额外小优化(可选)
如果你希望用户点击PDF内容时能重新显示缩略图,可以给PDFView加个点击手势:
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toggleThumbnailVisibility)) pdfView.addGestureRecognizer(tapGesture) @objc func toggleThumbnailVisibility() { thumbnailView.isHidden.toggle() }
这样就完美实现滑动翻页隐藏缩略图,点击屏幕切换显示状态的需求啦~
内容的提问来源于stack exchange,提问作者heyfrank
相关产品推荐
相关产品推荐

