2015-06-17 35 views
5

Mam aplikację, która składa się z interfejsu użytkownika Xcode Storyboard i hostowanego projektu Unity3D/Vuforia dla jednego z widoków. Wcześniej używałem Unity 4.6.2 i Vuforia 3.0.9 i miałem zaimplementowaną podklasę UnityAppDelegate z następującą metodą, która pozwoliła mi to zrobić.Hierarchia ViewController w iOS została zmieniona przy użyciu Unity 4.6.5 i aktualizacji 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; 

} 

Pisałem także rozszerzenie UINavigationController dalej obsługiwać zmiany rotacji w dół mojego widoku stosu (ładowanie różnych obrazów w zależności od orientacji).

Jednak musiałem zaktualizować moją aplikację, aby korzystać z Unity3D 4.6.5 i Vuforia 4.2 ze względu na 64-bitowe wymaganie dotyczące przesyłania aplikacji do App Store. To spowodowało kilka problemów.

  1. Powyższa metoda createViewHierarchyImpl nie działa już w tym stanie. To było rzucanie błąd wykonania:

kończące aplikację spowodowane nieprzechwyconego wyjątek „UIViewControllerHierarchyInconsistency”, powód: „Widok dziecko Kontroler: PPARStartViewController: 0x17dc3070 powinien mieć widok rodzic Kontroler: UnityDefaultViewController: 0x1c083200 ale rzeczywista dominującej jest: UINavigationController: 0x17dc3820 "

musiałem go zmienić na następujące:

-(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. Doing powyższe zmiany hierarchii z przed, a mój UINavigationControl Klasa rozszerzenia ler nie przechwytuje już wywołań rotacyjnych. Są teraz przechwytywane przez UnityDefaultViewController. Próbowałem rozszerzyć tę klasę w ten sam sposób, ale w czasie wykonywania ten widok kontroler wydaje się nie mieć dzieci, rodziców ani żadnego związku z aktualnie załadowanymi widokami.
  2. Wreszcie, i być może nie związane, ale jestem pewien, że może być, widok Vuforia nie obraca się prawidłowo. Portret i Pejzaż są w porządku, ale w trybie Krajobraz i Noc, obraz kamery jest odwracany.

Solutions mam nadzieję, dla:

  1. Idealnie Mam nadzieję, że ktoś może mi powiedzieć, że mój oryginalny kod na pytanie 1 jest to możliwe, a ja po prostu czegoś brakuje, że rozwiązuje związek rodzicielski moje kontrolery widoku.
  2. Jeśli nie, to muszę dowiedzieć się, jak przekazać powiadomienia o rotacji z UnityDefaultViewController do mojego kontrolera UINavigationController.
  3. Wreszcie, czy istnieje sposób na zatrzymanie obracania widoku UnityPlayer? Nie ma w nim nic oprócz źródła kamery i rozszerzonej zawartości, więc rzeczywisty widok nie musi się nawet obracać.
+1

Miałem również problemy podczas aktualizacji do Unity 5 z Vuforią 4.x, ale były one związane z innymi wtyczkami iOS. Podczas sprawdzania, co się dzieje, widziałem kilka komentarzy na temat 'createViewHierarchy' nie jest już używane. Być może pomaga to sprawdzić komentarze w wygenerowanych plikach klasy/nagłówka _Classes/UI/UnityAppController + ViewHandling.h_. Zachowaj ostrożność, jeśli użyjesz IMPL_APP_CONTROLLER_SUBCLASS do zarejestrowania własnego kontrolera aplikacji, ponieważ Vuforia robi to samo, co kończy się niezdefiniowanym zachowaniem, z którego jeden jest używany w końcu. – Kay

+0

Nadal używam jedności 4.6.6, więc nie jestem pewien, czy alternatywny do createViewHierarchy jest dostępny. Ale spojrzę na te jutro. Użyłem też własnego kontrolera aplikacji, ale po aktualizacji połączyłem go z wersją Vuforia. – Dover8

+0

Dzięki @Kay, twój komentarz wysłał mnie na ścieżkę do odpowiedzi, którą opisałem poniżej. – Dover8

Odpowiedz

0

Przeglądanie UnityAppController + ViewHandling.mm i porównywanie go ze starszą wersją z wersji Unity 4.6 Udało mi się wymyślić rozwiązanie.

W VuforiaNativeRendererController.mm zaimplementowałem również metodę createAutorotatingUnityViewController. Tutaj zwracam nową instancję UnityDefaultViewController (tak właśnie robił createViewHierarchyImpl).

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

Następnie w UnityAppController.mm usunąłem kod z nowej metody checkOrientationRequest, aw onForcedOrientation zamieniłem

[self transitionToViewController:[self createRootViewController]]; 

do starego sposobu:

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

Po tym wszystkim byłem w stanie wykorzystać mój oryginalny kod createViewHierarchyImpl i zachowaj kontrolę nad moimi obrotami.

Widok z kamery AR jest wciąż obrócony, ale teraz uważam, że jest to osobny problem.

[EDIT] Wyjaśniłem, dlaczego widok z kamery AR nie był zorientowany. Musiałem przekazać informację obrotu do viewcontroller który pełnił UnityView jako widok sub a następnie zadzwonić

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

teraz wszystkie rotacje pracują zgodnie z przeznaczeniem. :)