如何移除PDFView中的「Highlight」上下文菜单项并使用UIEditMenuInteraction?
一、移除Highlight上下文菜单项
系统预定义的菜单(比如share、lookup)可以通过buildMenu(with:)直接移除,但PDFKit的Highlight属于内部自定义菜单项,没法通过系统menu identifier直接删除,你可以通过重写canPerformAction(_:withSender:)方法屏蔽它:
class CustomPDFView: PDFView { override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { // 屏蔽Highlight动作 if action == #selector(PDFTextSelectionToolbar.toggleHighlight(_:)) { return false } // 保留其他需要的系统动作,也可返回false屏蔽更多项 return super.canPerformAction(action, withSender: sender) } }
之后用这个自定义的CustomPDFView替代原有的PDFView即可生效。
二、在PDFView中使用UIEditMenuInteraction
如果想完全接管上下文菜单的创建逻辑,推荐使用UIEditMenuInteraction,步骤如下:
- 给PDFView添加交互组件:
class CustomPDFView: PDFView { override init(frame: CGRect) { super.init(frame: frame) setupEditMenu() } required init?(coder: NSCoder) { super.init(coder: coder) setupEditMenu() } private func setupEditMenu() { let interaction = UIEditMenuInteraction(delegate: self) addInteraction(interaction) } }
- 实现
UIEditMenuInteractionDelegate协议,自定义菜单内容:
extension CustomPDFView: UIEditMenuInteractionDelegate { func editMenuInteraction(_ interaction: UIEditMenuInteraction, menuFor configuration: UIEditMenuConfiguration, suggestedActions: [UIMenuElement]) -> UIMenu? { // 过滤掉不需要的系统菜单项 let filteredActions = suggestedActions.filter { element in if let action = element as? UIAction, action.title == "Highlight" { return false } return true } // 添加自定义菜单项示例 let customAction = UIAction(title: "自定义操作", image: UIImage(systemName: "star")) { _ in // 执行自定义逻辑 print("触发自定义操作") } return UIMenu(title: "", children: filteredActions + [customAction]) } }
这种方式不仅能移除Highlight,还能自由增删菜单项,完全替代旧版UIMenuController的方案。
注意:要确保PDFView允许文本选中(默认开启状态),否则菜单交互不会触发。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

