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

从MFMailComposeViewController返回后ARSCNView场景被遮挡的问题求助

解决从MFMailComposeViewController返回后ARSCNView场景遮挡的问题

这个问题我之前帮开发者排查过好几次,大概率是视图层级错乱或者渲染上下文没有正确恢复导致的——毕竟MFMailComposeViewController是系统提供的模态视图,dismiss时偶尔会打乱原有视图的渲染优先级,虽然ARSession还在后台运行(所以hitTesting能正常工作),但ARSCNView的渲染输出被挡住了。给你几个靠谱的解决思路:

  • 强制调整视图层级,把ARSCNView放到最上层
    这是最常见的解决办法。在邮件视图dismiss完成的回调里,主动把ARSCNView带到视图层级的最前面,确保没有其他残留视图遮挡它:

    extension YourViewController: MFMailComposeViewControllerDelegate {
        func mailComposeController(_ controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: Error?) {
            controller.dismiss(animated: true) {
                // 把ARSCNView移到视图层级最上层
                self.view.bringSubviewToFront(self.arSCNView)
            }
        }
    }
    
  • 触发ARSCNView重新渲染
    有时候只是渲染上下文没有刷新,强制视图重绘就能解决问题。在dismiss的完成回调里添加这两行代码:

    self.arSCNView.setNeedsDisplay()
    self.arSCNView.layoutIfNeeded()
    
  • 重置ARSession运行状态(备选方案)
    如果上面两种方法都没用,可能是ARSession的渲染链路在模态切换时被中断了。可以尝试先暂停再重启session(如果不需要重置跟踪,就不要加.resetTracking这些选项):

    if let currentConfig = self.arSession.configuration {
        self.arSession.pause()
        // 如果不需要重置现有跟踪,就去掉options参数
        self.arSession.run(currentConfig, options: [.resetTracking, .removeExistingAnchors])
    }
    
  • 排查额外的遮挡视图
    别忘了检查你的代码里有没有在显示邮件视图前添加过临时overlay(比如加载提示、遮罩层),这些视图可能在dismiss后没有被正确移除,手动检查并移除它们即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:43:30