首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PDFView中禁用选择?

如何在PDFView中禁用选择?
EN

Stack Overflow用户
提问于 2018-03-04 19:28:32
回答 5查看 3.3K关注 0票数 8

PDFDocument中显示PDFView允许用户选择文档的部分并执行操作,例如,对所选内容进行“复制”。如何在PDFView中禁用选择,同时保留用户放大、缩小和滚动PDF的可能性?

PDFView本身似乎没有提供这样的属性,PDFViewDelegate也没有。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-03-04 20:02:01

您必须对PDFView进行子类,如下所示:

代码语言:javascript
复制
class MyPDFView: PDFView {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }

    override func addGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer) {
        if gestureRecognizer is UILongPressGestureRecognizer {
            gestureRecognizer.isEnabled = false
        }

        super.addGestureRecognizer(gestureRecognizer)
    }

}
票数 6
EN

Stack Overflow用户

发布于 2019-10-01 14:43:42

对于iOS 13,上述解决方案不再起作用。看起来他们改变了PDFView的内部实现,特别是手势识别器的设置方式。我认为通常不鼓励这样做,但是不使用任何内部API仍然可以做到,下面是如何做到的:

1)递归地收集PDFView的所有子视图(参见下面的帮助函数)

代码语言:javascript
复制
let allSubviews = pdfView.allSubViewsOf(type: UIView.self)

2)遍历它们并禁用任何UILongPressGestureRecognizer

代码语言:javascript
复制
for gestureRec in allSubviews.compactMap({ $0.gestureRecognizers }).flatMap({ $0 }) {
    if gestureRec is UILongPressGestureRecognizer {
        gestureRec.isEnabled = false
    }
}

帮助函数递归地获取给定类型的所有子视图:

代码语言:javascript
复制
func allSubViewsOf<T: UIView>(type: T.Type) -> [T] {
    var all: [T] = []
    func getSubview(view: UIView) {
        if let aView = view as? T {
            all.append(aView)
        }
        guard view.subviews.count > 0 else { return }
        view.subviews.forEach{ getSubview(view: $0) }
    }
    getSubview(view: self)
    return all
}

我从包含视图控制器的viewDidLoad方法中调用上述代码。

我还没有找到一种很好的方法将其转化为PDFView的子类,这将是可重用性的首选方法,并且可能只是上述NonSelectablePDFView的一个补充。到目前为止,我尝试的是重写didAddSubview并在调用super之后添加上述代码,但这并不像预期的那样有效。似乎手势识别器只是在后面的步骤中添加,因此确定何时添加手势识别器,以及子类在此之后是否有方法调用一些自定义代码,这将是下一步。

票数 3
EN

Stack Overflow用户

发布于 2020-02-24 13:44:56

只需要做的是它将自动清除选择和用户将不再长按PDF文本。

代码语言:javascript
复制
class MyPDFView: PDFView {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        self.currentSelection = nil
        self.clearSelection()

        return false
    }

    override func addGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer) {
        if gestureRecognizer is UILongPressGestureRecognizer {
            gestureRecognizer.isEnabled = false
        }

        super.addGestureRecognizer(gestureRecognizer)
    }

}

下面的2行需要添加canPerformAction()

代码语言:javascript
复制
self.currentSelection = nil
self.clearSelection()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49099499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档