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

