如何在 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 文本?