Swift中如何单独移除Lookup、Search Web菜单并保留Translate菜单
Swift中如何单独移除Lookup、Search Web菜单并保留Translate菜单
这个问题我之前也碰到过,确实有点坑——系统把Translate、Search Web这些功能都打包在Lookup菜单组里了,直接移除整个Lookup菜单自然会把Translate也一并带走。而且直接在canPerformAction()里单独处理Search Web的Selector没生效,大概率是因为没精准匹配到系统对应的Selector。试试下面两种方案,应该能解决你的问题:
方案一:自定义Lookup菜单,只保留Translate选项
与其直接移除整个Lookup菜单,不如先删掉原生的Lookup菜单,再手动创建一个只包含Translate选项的自定义Lookup菜单,这样就能精准保留你想要的功能:
class OriginalView: UIViewController { override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) // 先移除系统原生的Lookup菜单 builder.remove(menu: .lookup) // 创建Translate的操作项,这里可以自定义触发逻辑 let translateAction = UIAction(title: "Translate", image: UIImage(systemName: "text.bubble")) { [weak self] _ in // 如果想调用系统默认的Translate功能,直接触发系统对应的方法即可 self?.view.window?.perform(#selector(UIResponder.showTranslateUI(_:))) } // 组装成自定义的Lookup菜单(标题留空,保持和系统原生样式一致) let customLookupMenu = UIMenu(title: "", children: [translateAction]) // 将自定义菜单插入到Lookup组的起始位置 builder.insertChild(customLookupMenu, atStartOfMenu: .lookup) } }
方案二:通过canPerformAction()精准控制每个选项
系统每个菜单选项都对应特定的Selector,我们可以在PDFView子类里重写canPerformAction(),只允许Translate的Selector通过,同时拒绝Lookup和Search Web的Selector:
class CustomPDFView: PDFView { var toolMode: ToolMode = .none override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { switch toolMode { case .comment, .highlight, .translate: return false default: // 允许保留的操作:Copy、SelectAll、Translate let allowedActions: [Selector] = [ #selector(copy(_:)), #selector(selectAll(_:)), #selector(UIResponder.showTranslateUI(_:)) ] if allowedActions.contains(action) { return true } // 需要移除的操作:Lookup、Search Web let blockedActions: [Selector] = [ #selector(UIResponder.lookup(_:)), #selector(UIResponder.searchWeb(_:)) ] if blockedActions.contains(action) { return false } // 其他操作沿用系统默认逻辑 return super.canPerformAction(action, withSender: sender) } } }
注意事项
- 确保你的
CustomPDFView是当前界面的第一响应者,否则canPerformAction()可能不会被正确调用; - 系统的Selector可能在不同iOS版本有细微变化,建议在目标iOS版本上多测试验证。
备注:内容来源于stack exchange,提问作者김예림
相关产品推荐
相关产品推荐

