这是我的 PDFView 配置。我想显示带有水平滚动的 PDF 查看器,显示单页。
但是 PDFView 显示滚动指示器,这是不正确的。我想隐藏滚动指示器。我的问题是如何隐藏它或如何使其滚动位置正确?
pdfView.autoScales = true
pdfView.displaysPageBreaks = true
pdfView.displayMode = .singlePageContinuous
pdfView.usePageViewController(true)
pdfView.displayDirection = .horizontal
pdfView.minScaleFactor = 1
pdfView.document = pdfDocument
由于 PDFview 不允许访问其滚动元素,因此访问 pdfview 子视图的技巧可能对您有用。
在控制台上打印时的子视图链如下所示:
(lldb) po pdfView.subviews
▿ 1 element
- 0 : <_UIPageViewControllerContentView: 0x7fec7411d9f0; frame = (0 0; 414 808); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x600001b33720>>
(lldb) po pdfView.subviews.first?.subviews.first
▿ Optional<UIView>
- some : <_UIQueuingScrollView: 0x7fec7483aa00; frame = (0 0; 414 736); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x6000015153e0>; layer = <CALayer: 0x600001b33740>; contentOffset: {414, 0}; contentSize: {1242, 736}; adjustedContentInset: {0, 0, 0, 0}>
(lldb)
基于此,我测试了下面的代码,它在我的最终工作。尝试使用代码:
let pdfScrollView = pdfView.subviews.first?.subviews.first as? UIScrollView
pdfScrollView?.showsHorizontalScrollIndicator = false // if pdf view scroll direction is horizontal
pdfScrollView?.showsVerticalScrollIndicator = false // if pdf view scroll direction is vertical
编辑:
视图的层次结构已更新,scrollView 不在第一位 请参考@Deepansh 的答案来获取scrollView对象: https://stackoverflow.com/a/77080309/2677551
UIScrollView 不再位于第一个子视图内(如前面的答案中所述),因此迭代所有子视图以找到 UIScrollView
extension PDFView {
func hideScrollViewIndicator(){
for subview in subviews {
if let scrollView = subview as? UIScrollView {
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
return
}
}
}
}
并像这样使用它:
pdfView.hideScrollViewIndicator()
我认为找到子视图的
UIScrollView
是更好的解决方案:
它在 SwiftUI 2、3 上经过测试,运行良好。
UIViewRepresentable > makeUIView function
找到UIScrollView并修改:
let pdfView = PDFView()
for view in pdfView.subviews {
if let scrollView = findUIScrollView(of: view) {
scrollView.showsHorizontalScrollIndicator = false
scrollView.showsVerticalScrollIndicator = false
}
}
func findUIScrollView(of uiView: UIView) -> UIScrollView? {
if let scrollView = uiView as? UIScrollView {
return scrollView
}
for view in uiView.subviews {
if let scrollView = view as? UIScrollView {
return scrollView
}
if !view.subviews.isEmpty {
return findUIScrollView(of: view)
}
}
return nil
}
我实现了一个扩展,然后这样使用,请看一下。
import Foundation
import PDFKit
extension PDFView {
var scrollView: UIScrollView? {
guard let pageViewControllerContentView = subviews.first else { return nil }
for view in pageViewControllerContentView.subviews {
guard let scrollView = view as? UIScrollView else { continue }
return scrollView
}
return nil
}
}
然后我用
override func layoutSubviews() {
super.layoutSubviews()
pdfView.scrollView?.showsVerticalScrollIndicator = false
pdfView.scrollView?.showsHorizontalScrollIndicator = false
}
另一种更直接的方法是:在您的应用程序开始显示带有
PDFView
的元素(例如 UIViewController
)之前,您需要设置此
UIScrollView.appearance().showsVerticalScrollIndicator = false
UIScrollView.appearance().showsHorizontalScrollIndicator = false
它会对你有用。 然后,当您需要关闭
UIViewController
或带有 PDView
的其他元素时,您可以返回之前的设置
UIScrollView.appearance().showsVerticalScrollIndicator = true
UIScrollView.appearance().showsHorizontalScrollIndicator = true
它应该可以工作。