2015-06-17 27 views
5

Ho un'app che consiste nell'interfaccia utente Xcode Storyboard e un progetto Unity3D/Vuforia ospitato per una delle visualizzazioni. In precedenza utilizzavo Unity 4.6.2 e Vuforia 3.0.9 e avevo implementato una sottoclasse UnityAppDelegate con il seguente metodo che mi permetteva di farlo.Gerarchia ViewController iOS modificata con Unity 4.6.5 e aggiornamento 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; 

} 

Ho anche scritto un'estensione di UINavigationController per gestire le modifiche rotazione più in basso Ritengo pila (caricamento di immagini differenti a seconda dell'orientamento).

Tuttavia, ho dovuto aggiornare la mia app per utilizzare Unity3D 4.6.5 e Vuforia 4.2 a causa del requisito di 64 bit per l'invio di app all'App Store. Questo ha causato un paio di problemi.

  1. Il metodo createViewHierarchyImpl sopra non funziona più in quello stato. Si stava gettando un errore di runtime:

terminazione app a causa di non rilevata eccezione 'UIViewControllerHierarchyInconsistency', la ragione: 'controller di vista del bambino: PPARStartViewController: 0x17dc3070 dovrebbe avere vista padre regolatore: UnityDefaultViewController: 0x1c083200 ma genitore reale è: UINavigationController: 0x17dc3820 '

ho dovuto cambiare al seguente:

-(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; 
    } 
  1. fare quanto sopra cambia la Gerarchia da prima, e la mia UINavigationControl La sua classe di estensione non cattura più le chiamate di rotazione. Ora vengono catturati da UnityDefaultViewController. Ho provato ad estendere questa classe allo stesso modo, ma in fase di esecuzione sembra che il controller di visualizzazione non abbia figli, genitori o alcuna relazione con le viste attualmente caricate.
  2. Infine, e probabilmente non correlato ma sono sicuro che potrebbe essere, la vista Vuforia non sta ruotando correttamente. Verticale e Orizzontale sono perfetti, ma in LandscapeRight e PortraitUpsidedown l'alimentazione della fotocamera viene capovolta.

Solutions Spero in:

  1. Idealmente Sto sperando che qualcuno mi può dire che il mio codice originale per la domanda 1 è possibile e io sono solo manca qualcosa che fissa il rapporto dei genitori di i miei controller di visualizzazione.
  2. In caso contrario, ho bisogno di scoprire come passare le notifiche di rotazione verso il basso da UnityDefaultViewController al mio UINavigationController.
  3. E infine, c'è un modo per interrompere la rotazione della vista di UnityPlayer? Non c'è nulla al di fuori del feed della telecamera e del contenuto aumentato, quindi la vista effettiva non ha nemmeno bisogno di ruotare.
+1

Ho avuto problemi anche durante l'aggiornamento a Unity 5 con Vuforia 4.x ma erano collegati ad altri plugin iOS. Durante la ricerca di ciò che sta accadendo, ho visto alcuni commenti su 'createViewHierarchy' non più utilizzati. Forse aiuta a controllare i commenti nei file di classe/header generati _Classes/UI/UnityAppController + ViewHandling.h_. Fai attenzione se usi IMPL_APP_CONTROLLER_SUBCLASS per registrare il tuo controller dell'app perché Vuforia fa lo stesso che termina in un comportamento indefinito che viene utilizzato alla fine – Kay

+0

Sto ancora usando unità 4.6.6 quindi non sono sicuro se l'alternativa a createViewHierarchy è disponibile. Domani darò un'occhiata a questi. Inoltre, stavo usando il mio controller dell'app, ma l'ho fuso con quello di Vuforia dopo l'aggiornamento. – Dover8

+0

Grazie a @Kay, il tuo commento mi ha inviato sul percorso della risposta, che ho dettagliato di seguito. – Dover8

risposta

0

Guardando in UnityAppController + ViewHandling.mm e confrontandolo con la versione precedente di pre Unity 4.6 sono riuscito a trovare una soluzione.

In VuforiaNativeRendererController.mm Ho anche implementato il metodo createAutorotatingUnityViewController. Qui restituisco una nuova istanza di UnityDefaultViewController (questo è ciò che createViewHierarchyImpl).

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

Quindi in UnityAppController.mm ho rimosso il codice dal nuovo metodo checkOrientationRequest, e nel onForcedOrientation scambiato il

[self transitionToViewController:[self createRootViewController]]; 

al vecchio modo di:

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

Dopo tutto questo sono stato in grado di utilizzare il mio codice originale per createViewHierarchyImpl e mantenere il controllo sulle mie rotazioni.

La vista della videocamera AR è ancora ruotata in alcune rotazioni, ma ora credo che sia un problema separato.

[EDIT] Ho scoperto perché la vista della videocamera AR non era orientata. Dovevo passare le notifiche di rotazione al viewcontroller che teneva l'UnityView come vista secondario e quindi chiamare

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

ora tutte le rotazioni funzionino come previsto. :)