2015-06-17 62 views
5

我有一个应用程序,其中包含Xcode Storyboard UI和托管Unity3D/Vuforia项目的其中一个视图。我之前使用Unity 4.6.2和Vuforia 3.0.9,并且已经使用以下方法实现了UnityAppDelegate子类,这允许我执行此操作。iOS ViewController层次结构更改为Unity 4.6.5和Vuforia 4.2更新

-(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进一步处理旋转变化了我的看法栈(加载不同的图像取决于方向)。

但是,我必须更新我的应用程序才能使用Unity3D 4.6.5和Vuforia 4.2,因为要将应用程序提交到App Store需要64位。这导致了一些问题。

  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; 
    } 
  • 从之前做上述变化层次,以及我的UINavigationControl ler扩展类不再捕获轮换调用。他们现在被UnityDefaultViewController捕获。我试图以相同的方式扩展这个类,但是在运行时,视图控制器似乎没有孩子,父母或与当前加载的视图的任何关系。
  • 最后,可能无关,但我确定它可能是,Vuforia视图不能正确旋转。肖像和LandscapeLeft都很好,但在LandscapeRight和PortraitUpsidedown中,相机馈送会翻转。
  • 解决方案,我希望:

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

    我有问题,也有Vuforia 4.x版升级到Unity 5时,但他们与其他iOS插件。在找出发生了什么的过程中,我看到关于'createViewHierarchy'的一些注释不再使用。也许它有助于检查生成的类/头文件_Classes/UI/UnityAppController + ViewHandling.h_中的注释。如果你使用IMPL_APP_CONTROLLER_SUBCLASS因为Vuforia做,其中一个是用到底 – Kay

    +0

    我仍在使用统一4.6.6未定义行为从而结束相同的,所以我不知道,注册自己的应用程序控制器照顾,如果候补createViewHierarchy可用。不过明天我会看看这些。 另外,我使用我自己的应用程序控制器,但在更新后将它合并到Vuforia中。 – Dover8

    +0

    谢谢@Kay,您的评论确实将我发送到了答案的路径上,我在下面详细介绍了答案。 – Dover8

    回答

    0

    纵观UnityAppController + ViewHandling.mm并将其与Unity 4.6以前的旧版本进行比较,我能够想出一个解决方案。

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

    -(UIViewController*)createAutorotatingUnityViewController 
    { 
        return [[UnityDefaultViewController alloc] init]; 
    } 
    

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

    [self transitionToViewController:[self createRootViewController]]; 
    

    来的老办法:

    OrientView(_rootController, _rootView, orient); 
    [_rootView layoutSubviews]; 
    

    这一切后,我能够用我的原代码createViewHierarchyImpl和保留对我的轮换的控制权。

    的AR相机视图仍然翻转一些轮换,但现在我相信这是一个单独的问题。

    [编辑] 我想通了,为什么AR摄影机视图没有定向。我需要通过旋转通知到举行的UnityView作为子视图的视图 - 控制,然后调用

    [subView willRotateTo:ConvertToUnityScreenOrientation(toInterfaceOrientation, 0)]; 
    

    现在所有旋转都如预期运行。 :)