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

UITransitionView层级卡顿及3D Touch预览重复警告问题求助

针对UITextView 3D Touch预览后UITransitionView卡顿的临时解决方案

我之前测试原生UITextView的3D Touch链接预览时,也碰到过一模一样的系统Bug——触发[UIPreviewItemController stopInteraction] called more than once警告后,从Safari返回应用,UITransitionView就卡在屏幕上无法操作,复现率确实不高但很影响体验。结合你的单视图应用场景,给你几个可行的临时解决思路:

  • 直接禁用原生3D Touch预览(最简单)
    如果你的业务不需要这个预览功能,直接设置textView.allowsLinkPreview = false就能彻底规避这个Bug,这是最快的解决方案。

  • 自定义链接交互逻辑替代原生预览
    要是必须保留链接的预览能力,可以通过UITextViewDelegate拦截原生的预览事件,用自己的逻辑实现:

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        // 拦截3D Touch预览事件
        if interaction == .preview {
            // 这里可以用自定义的弹窗、ViewController来展示链接预览
            // 比如弹出一个带webView的小弹窗
            return false // 阻止原生预览控制器触发
        }
        // 普通点击链接还是走系统默认逻辑
        return true
    }
    

    绕过原生的预览控制器后,就不会触发那个系统级的交互异常了。

  • 暴力清理残留的过渡视图
    如果你一定要保留原生预览,可以尝试在应用从后台回到前台时,手动清理残留的UITransitionView:

    func applicationDidBecomeActive(_ application: UIApplication) {
        // 遍历所有窗口,找到并移除UITransitionView
        for window in UIApplication.shared.windows {
            window.subviews.forEach { subview in
                if NSStringFromClass(subview.classForCoder) == "UITransitionView" {
                    subview.removeFromSuperview()
                }
            }
        }
    }
    

    这个方法属于应急修复,需要注意测试是否会影响其他正常的页面转场,不过在你的单视图应用里风险相对较小。

另外,既然已经确认是iOS系统Bug,记得按照警告提示提交雷达给苹果,附上你的复现项目、视频和视图层级截图,帮助官方修复这个问题。

内容的提问来源于stack exchange,提问作者Yura Sirko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:34:28