iOS16如何移除UITextView默认菜单Open Link等项仅保留复制项
iOS16下自定义UITextView上下文菜单仅保留「Copy」选项实现方案
问题根因
iOS 16 调整了UITextView链接类上下文菜单的生成链路,直接重写canPerformAction(_:withSender:)返回false,无法拦截系统为链接交互单独注入的「Open Link」「Add to Reading List」菜单项——这两个选项不经过旧的响应链动作校验流程,旧的拦截方案对其无效。
具体实现
在自定义UITextView子类中同时重写两个方法,同时覆盖旧版本链路和iOS16新增的菜单构建链路即可:
class CustomTextView: UITextView { override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { // 旧版本系统下仅放行复制动作,拦截其余所有默认菜单项 return action == #selector(copy(_:)) } override func buildMenu(with builder: UIMenuBuilder) { // iOS16+ 移除系统注入的链接操作、阅读列表相关菜单组 builder.remove(menu: .link) builder.remove(menu: .readingList) super.buildMenu(with: builder) } }
补充说明
- 上述实现向下兼容iOS16以下系统:低版本不会触发
buildMenu(with:)调用,仅靠canPerformAction的逻辑即可完成菜单过滤,无兼容性问题 - 若后续发现其他多余的系统菜单项,可通过打印
builder内置的系统菜单标识,调用remove(menu:)按需移除即可 - 该方案不会影响链接的基础点击交互,若需要自定义链接点击跳转逻辑,正常实现
UITextViewDelegate的对应代理方法即可

内容的提问来源于stack exchange,提问作者chaselop
相关产品推荐
相关产品推荐

