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
相关产品推荐
相关产品推荐

