You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者김예림

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:25:26