调用VNDocumentCameraViewController后RootViewController约束丢失引发黑屏问题
解决方案
1. 检查RootTabBarController的XIB布局与初始化
如果RootTabBarController是通过XIB创建的,初始化时必须明确指定XIB文件名,否则系统可能生成空视图导致布局异常:
// 替换原初始化代码 window?.rootViewController = RootTabBarController(nibName: "RootTabBarController", bundle: nil)
同时检查XIB内的约束:确保控制器的view与父容器(window)的leading、trailing、top、bottom都有约束,或者保留view.translatesAutoresizingMaskIntoConstraints = true(UIViewController的view默认开启该属性,不要手动关闭)。
2. 规范VNDocumentCameraViewController的转场逻辑
确保使用标准的present/dismiss流程,避免自定义转场逻辑破坏布局:
// 呈现相机控制器 let cameraVC = VNDocumentCameraViewController() cameraVC.delegate = self present(cameraVC, animated: true) // 关闭相机控制器(在代理方法中) func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) { controller.dismiss(animated: true, completion: nil) } func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) { controller.dismiss(animated: true, completion: nil) }
3. 强制恢复根控制器布局(临时修复)
如果上述方法无效,可在dismiss完成后重新初始化根控制器,强制恢复布局:
controller.dismiss(animated: true) { guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return } let newWindow = UIWindow(windowScene: windowScene) newWindow.rootViewController = RootTabBarController(nibName: "RootTabBarController", bundle: nil) self.window = newWindow newWindow.makeKeyAndVisible() }
4. XIB与Storyboard的兼容问题
不需要将XIB导入Storyboard,直接通过代码初始化XIB控制器即可。如果后续想改用Storyboard,可在Storyboard中添加Tab Bar Controller,然后将其类设置为RootTabBarController,无需迁移XIB内容。
内容的提问来源于stack exchange,提问作者Boris S
相关产品推荐
相关产品推荐

