【发布时间】:2026-02-18 21:55:01
【问题描述】:
我正在使用 swift 和 PDFKit 成功地将高亮注释添加到 pdf,但我无法弄清楚如何让用户再次删除高亮。
用户可以正常选择文本,然后从 UIMenu 中选择“突出显示”或“取消突出显示”。
为了在选择文本时自定义 pdfView,我更改了出现的菜单 - 首先删除默认操作:
extension PDFView {
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
然后在 viewDidLoad() 中我设置了我的自定义 UIMenuItems:
let menuItem1 = UIMenuItem(title: "Highlight", action: #selector(highlightSelection(_:)))
let menuItem2 = UIMenuItem(title: "Remove highlight", action: #selector(removeHighlightSelection(_:)))
UIMenuController.shared.menuItems = [menuItem1, menuItem2]
选择高亮时:
@objc func highlightSelection(_ sender: UIMenuItem) {
let selections = pdfViewer.currentSelection?.selectionsByLine()
guard let page = selections?.first?.pages.first else { return }
selections?.forEach({ selection in
let highlight = PDFAnnotation(bounds: selection.bounds(for: page), forType: .highlight, withProperties: nil)
highlight.color = .yellow
page.addAnnotation(highlight)
})
}
到目前为止,一切都很好 - 到目前为止一切正常。突出显示文本并创建注释。
现在是我的问题:
当我选择突出显示的文本时,我希望用户能够通过点击“删除突出显示”来删除突出显示注释,但我根本无法弄清楚如何仅删除隐藏在所选文本“后面”的注释。
此代码有效,但删除了整个页面上的所有注释:
@objc func removeHighlightSelection(_ sender: UIMenuItem) {
let selections = pdfViewer.currentSelection?.selectionsByLine()
guard let page = selections?.first?.pages.first else { return }
let annotationsToRemove = page.annotations
for annotation in annotationsToRemove {
page.removeAnnotation(annotation)
print("Removed: \(annotation)")
}
}
那么,如何仅删除选定的高亮注释?
顺便说一句 - 我知道整个菜单的东西并不真正相关,但我希望有人在使用高亮注释时会发现这个问题,然后能够使用该部分。
谢谢, 埃米尔。
【问题讨论】:
标签: swift pdf annotations highlight pdfkit