我有一个包含Xcode Storyboard UI和一个其中一个 View 的托管Unity3D/Vuforia项目的应用程序。我以前使用的是Unity 4.6.2和Vuforia 3.0.9,并使用以下允许我执行此操作的方法实现了UnityAppDelegate子类。
-(void)createViewHierarchyImpl
{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"AR" bundle:nil];
PPARStartViewController * helloVC = (PPARStartViewController *)[sb instantiateViewControllerWithIdentifier:@"StartController"];
self.navController = [[UINavigationController alloc] initWithRootViewControllier:helloVC];
self.navController.navigationBarHidden = YES;
_rootController = self.navController;
_rootView = self.navController.view;
}
我还为UINavigationController编写了一个Extension,以处理 View 堆栈中进一步的旋转更改(根据方向加载不同的图像)。
但是,由于将应用程序提交到App Store的64位要求,我不得不更新我的应用程序以使用Unity3D 4.6.5和Vuforia 4.2。这引起了两个问题。
由于未捕获的异常“UIViewControllerHierarchyInconsistencyency”而终止应用程序,原因:“ subview Controller :PPARStartViewController:0x17dc3070应该具有父 View Controller :UnityDefaultViewController:0x1c083200,但实际父 View 是:UINavigationController:0x17dc3820”
我不得不将其更改为以下内容:
-(void)createViewHierarchyImpl
{
_rootController = [[UIViewController alloc] init];
_rootView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_rootController.view = _rootView;
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"AR" bundle:nil];
PPARStartViewController * helloVC = (PPARStartViewController *)[sb instantiateViewControllerWithIdentifier:@"StartController"];
self.navController = [[UINavigationController alloc] initWithRootViewController:helloVC];
[_rootView addSubview:self.navController.view];
self.navController.navigationBarHidden = YES;
}
我希望的解决方案:
最佳答案
查看UnityAppController + ViewHandling.mm并将其与Unity 4.6之前的旧版本进行比较,我提出了一个解决方案。
在VuforiaNativeRendererController.mm中,我还实现了createAutorotatingUnityViewController方法。在这里,我返回一个UnityDefaultViewController的新实例(这是createViewHierarchyImpl曾经做过的事情)。
-(UIViewController*)createAutorotatingUnityViewController
{
return [[UnityDefaultViewController alloc] init];
}
然后在UnityAppController.mm中,我从新的checkOrientationRequest方法中删除了代码,并在onForcedOrientation中交换了
[self transitionToViewController:[self createRootViewController]];
到旧的方式:
OrientView(_rootController, _rootView, orient);
[_rootView layoutSubviews];
毕竟,我可以将原始代码用于createViewHierarchyImpl并保持对旋转的控制。
增强现实相机 View 仍然会旋转一些,但我现在认为这是一个单独的问题。
[编辑]
我弄清楚了为什么AR相机 View 无法定向。我需要将旋转通知传递给将UnityView作为 subview 保存的viewcontroller,然后调用
[subView willRotateTo:ConvertToUnityScreenOrientation(toInterfaceOrientation, 0)];
现在,所有旋转均按预期进行。 :)
关于iOS ViewController层次结构随着Unity 4.6.5和Vuforia 4.2更新而更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30897652/