如何在 PDFView 中移动 PDFPage 上的 PDFAnnotation?

Posted

技术标签:

【中文标题】如何在 PDFView 中移动 PDFPage 上的 PDFAnnotation?【英文标题】:How do you move a PDFAnnotation on a PDFPage within a PDFView? 【发布时间】:2021-02-01 11:14:42 【问题描述】:

我正在使用 PDFKit 并且类似于 Apple Preview App,在添加 PDF 注释时,我希望用户能够在页面上移动它们。我创建了一个example project on Github。

我已经尝试继承 PDFView 并覆盖 func mouseDown(with event: NSEvent)func mouseDragged(with event: NSEvent)。我可以分享该代码,但我有一种直觉,我正朝着错误的方向前进。 (我想我无法让该代码工作的事实证实了这种感觉......)

编辑:我已将以下代码添加到我的 PDFView。它可以工作,但不能优雅地工作。它不像预览应用程序的工作方式那么流畅。只是想在这里学习,所以也许有人有更好的方法?

private var annotationBeingDragged:PDFAnnotation?

override func mouseDown(with event: NSEvent) 
    let areaOfInterest = self.areaOfInterest(forMouse: event)
    if areaOfInterest.contains(.annotationArea),
        let currentPage = self.currentPage,
        let annotation = currentPage.annotation(at: self.convert(self.convert(event.locationInWindow, from: nil), to: currentPage)) 

        if annotationBeingDragged == nil 
            annotationBeingDragged = annotation
         else 
            super.mouseDown(with: event)
        
    
    else 
        super.mouseDown(with: event)
    


override func mouseDragged(with event: NSEvent) 

    if let annotation = annotationBeingDragged,
        let currentPage = self.currentPage 
        
            currentPage.removeAnnotation(annotation)
            let currentPoint = self.convert(self.convert(event.locationInWindow, from: nil), to: currentPage)
            annotation.bounds = NSRect(origin: currentPoint, size: annotation.bounds.size)
            currentPage.addAnnotation(annotation)
    
    else 
        super.mouseDragged(with: event)
    


override func mouseUp(with event: NSEvent) 
    if annotationBeingDragged != nil 
        annotationBeingDragged = nil
        super.mouseDown(with: event)
    
    else 
        super.mouseUp(with: event)
    

【问题讨论】:

【参考方案1】:

在您的 mouseUp 方法更改中对您的代码进行微小的更改。

super.mouseDown(with: event)

super.mouseUp(with: event)

它的工作顺利。

【讨论】:

谢谢@Dhaval。但是如果您克隆我的 GitHub 项目并尝试进行更改,则无法打开注释(这会使注释无用。)通常,您可以打开注释并为其添加注释。我将 super.mouseDown 放在 mouseUp 方法中,作为一种在您不移动注释时打开注释的 hack-y 方式。

以上是关于如何在 PDFView 中移动 PDFPage 上的 PDFAnnotation?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 IOS swift 4 中编辑 PDFPage 文本?

如何设置 PDFPage 标签并重绘缩略图?

如何在 PDF Kit 的 PDFView 背景上绘制文本

在 PDFView (iOS) 上禁用缩放

如何知道用户何时在 PDFView 中滑动到下一页? - 安卓

Android:如何在 Robolectric 中测试 PDFView?