iOS ViewController层次结构随Unity 4.6.5和Vuforia 4.2更新而更改

Dov*_*er8 5 objective-c unity-game-engine ios vuforia

我有一个应用程序,包括Xcode Storyboard UI和一个托管的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;

}
Run Code Online (Sandbox Code Playgroud)

我还写了一个UINavigationController扩展来处理视图堆栈中的旋转变化(根据方向加载不同的图像).

但是,由于64位要求将应用程序提交到App Store,我不得不更新我的应用程序以使用Unity3D 4.6.5和Vuforia 4.2.这引起了一些问题.

  1. 上面的createViewHierarchyImpl方法不再适用于该状态.它抛出了一个运行时错误:

由于未捕获异常'UIViewControllerHierarchyInconsistency'而终止应用程序,原因:'子视图控制器:PPARStartViewController:0x17dc3070应该有父视图控制器:UnityDefaultViewController:0x1c083200但实际父节点是: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;
    }
Run Code Online (Sandbox Code Playgroud)
  1. 执行上述操作会更改以前的Hierarchy,并且我的UINavigationController扩展类不再捕获旋转调用.它们现在被UnityDefaultViewController捕获.我尝试以相同的方式扩展此类,但在运行时,视图控制器似乎没有子项,父项或与当前加载的视图的任何关系.
  2. 最后,可能不相关,但我确信它可能是,Vuforia视图无法正确旋转.纵向和LandscapeLeft很好,但在LandscapeRight和PortraitUpsidedown中,相机进纸被翻转.

我希望的解决方案:

  1. 理想情况下,我希望有人可以告诉我,问题1的原始代码是可能的,我只是遗漏了修复我的视图控制器的父母关系的东西.
  2. 如果没有,那么我需要找出如何将旋转通知从UnityDefaultViewController传递到我的UINavigationController.
  3. 最后,有没有办法阻止UnityPlayer视图旋转?除了相机输入和增强内容之外,其他任何内容都没有,因此实际视图甚至不需要旋转.

Dov*_*er8 0

通过研究 UnityAppController+ViewHandling.mm 并将其与 Unity 4.6 之前的旧版本进行比较,我找到了一个解决方案。

在 VuforiaNativeRendererController.mm 中,我还实现了 createAutorotatingUnityViewController 方法。在这里,我返回一个新的 UnityDefaultViewController 实例(这就是 createViewHierarchyImpl 用来做的事情)。

-(UIViewController*)createAutorotatingUnityViewController
{
    return [[UnityDefaultViewController alloc] init];
}
Run Code Online (Sandbox Code Playgroud)

然后在 UnityAppController.mm 中,我从新的 checkOrientationRequest 方法中删除了代码,并在 onForcedOrientation 中交换了

[self transitionToViewController:[self createRootViewController]];
Run Code Online (Sandbox Code Playgroud)

到旧的方式:

OrientView(_rootController, _rootView, orient);
[_rootView layoutSubviews];
Run Code Online (Sandbox Code Playgroud)

毕竟,我能够使用 createViewHierarchyImpl 的原始代码并保留对旋转的控制。

AR 相机视图仍然会翻转一些旋转,但我现在认为这是一个单独的问题。

[编辑] 我弄清楚了为什么 AR 相机视图没有定向。我需要将旋转通知传递给将 UnityView 作为子视图的视图控制器,然后调用

[subView willRotateTo:ConvertToUnityScreenOrientation(toInterfaceOrientation, 0)]; 
Run Code Online (Sandbox Code Playgroud)

现在所有轮换都按预期进行。:)