我有一个包含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。这引起了两个问题。
  • 上面的createViewHierarchyImpl方法在该状态下不再起作用。它抛出了运行时错误:

  • 由于未捕获的异常“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;
        }
    
  • 执行上述操作会更改以前的层次结构,并且我的UINavigationController扩展类不再捕获旋转调用。现在,它们被UnityDefaultViewController捕获。我尝试以相同的方式扩展此类,但在运行时, View Controller 似乎与当前加载的 View 没有子代,父代或任何关系。
  • 最后,可能无关,但我确定可能是这样,Vuforia View 无法正确旋转。 Portrait和LandscapeLeft都可以,但是在LandscapeRight和PortraitUpsidedown中,照相机馈送已翻转。

  • 我希望的解决方案:
  • 理想情况下,我希望有人可以告诉我问题1的原始代码是可能的,而我只是缺少一些可以固定 View Controller 的父级关系的东西。
  • 如果没有,那么我需要找出如何将Rotation通知从UnityDefaultViewController向下传递到我的UINavigationController。
  • 最后,是否有一种方法可以停止UnityPlayer View 的旋转?除了摄像机的提要和扩充的内容外,它什么都没有,因此实际 View 甚至不需要旋转。
  • 最佳答案

    查看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/

    10-11 10:57