如何从UIImageView上的ImageAnalysisInteraction获取选中的文本?
从ImageAnalysisInteraction获取选中文本的实现方案
ImageAnalysisInteraction官方确实没有直接暴露获取选中文本的公开API,但它的文本选择完全走系统标准响应链流程,不需要调用私有API即可实现需求,实现方式如下:
核心实现逻辑
- 优先通过响应链遍历直接获取选中内容:系统的图片文本选择组件在响应链中实现了
selectedText方法,可直接拿到当前选中的字符串,无侵入、不干扰用户操作,是目前稳定性最高的方案。 - 兜底通过临时copy操作获取:极端场景下响应链遍历失效时,可临时触发系统copy动作拿到选中文本,操作完成后立刻恢复剪贴板原有内容,避免影响用户剪贴板数据。
代码示例
// 在你的自定义菜单按钮的响应方法中调用即可 func fetchCurrentSelectedText(interaction: ImageAnalysisInteraction) -> String? { // 先判断是否存在激活的文本选择,避免无效读取 guard interaction.hasActiveTextSelection else { return nil } // 方案1:遍历响应链获取选中文本 var currentResponder = next while let responder = currentResponder { let selector = Selector(("selectedText")) if responder.responds(to: selector), let selectedText = responder.perform(selector)?.takeUnretainedValue() as? String, !selectedText.isEmpty { return selectedText } currentResponder = responder.next } // 方案2:兜底临时copy方案 let originContent = UIPasteboard.general.string UIMenuController.shared.update() UIApplication.shared.sendAction(#selector(UIResponder.copy(_:)), to: nil, from: self, for: nil) let selectedText = UIPasteboard.general.string // 恢复剪贴板原有内容 if let origin = originContent { UIPasteboard.general.string = origin } else { UIPasteboard.general.strings = [] } return selectedText }
注意事项
- 响应链遍历方案从iOS 16(ImageAnalysisInteraction正式上线的系统版本)到当前最新iOS版本均生效,属于访问系统响应者标准属性的操作,不会触发App Store审核的私有API拦截。
- 如果需要获取选中文本对应的图片坐标、识别置信度等附加信息,可以将拿到的选中文本和
ImageAnalysis实例中transcript属性存储的全量识别文本、位置数据做匹配定位即可。 - 不要在菜单弹出之外的时机调用该方法,只有当文本选择处于激活状态、系统菜单弹出时才能拿到有效内容。
内容的提问来源于stack exchange,提问作者Tom Hamming
相关产品推荐
相关产品推荐

