在 PDFKit 中隐藏指示器滚动

问题描述 投票:0回答:4

这是我的 PDFView 配置。我想显示带有水平滚动的 PDF 查看器,显示单页。

但是 PDFView 显示滚动指示器,这是不正确的。我想隐藏滚动指示器。我的问题是如何隐藏它或如何使其滚动位置正确?

Horizontal scroll indicator visible at bottom of screen
pdfView.autoScales = true
pdfView.displaysPageBreaks = true
pdfView.displayMode = .singlePageContinuous
pdfView.usePageViewController(true)
pdfView.displayDirection = .horizontal
pdfView.minScaleFactor = 1
pdfView.document = pdfDocument
ios swift pdfkit
4个回答
3
投票

由于 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


1
投票

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()

0
投票

我认为找到子视图的

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
}

0
投票

我实现了一个扩展,然后这样使用,请看一下。

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

它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.