7

mam UIViewController na iPadzie z tej konfiguracji:nie willRotateToInterfaceOrientation miano od prezentowane viewcontroller

shouldAutorotate (true) supportedInterfaceOrientations (UIInterfaceOrientationMaskAll) i wewnątrz willRotateToInterfaceOrientation i wykonać pewne sztuczki, aby dostosować mój interfejs.

Od dziecka tego kontrolera pokazuję QuickLookController z tym kodem-luźnym.

[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:previewController animated:YES completion:nil]; 

Ale gdybym obracać mój ipad metoda willRotateToInterfaceOrientation nie miano, więc nie daje rade, aby dostosować interfejs.

Ktoś może mi wyjaśnić lub przekazać mi kilka rad? Dzięki

Odpowiedz

12

Powód: Może istnieć wiele możliwości rozwiązania tego problemu.

1) Jeśli twój pogląd na viewController jest subView jakiegoś innego rootViewController który nie jest navigationController, wtedy może istnieć prawdopodobieństwo, że wezwanie obrót nie jest propagowana do kontrolera za podrzędny.

2) Gdzieś czytałem, że jeśli Super metody nie są nazywane odpowiednio, gdzie jest to potrzebne to może być przyczyną problemu rotacji, co oznacza, że ​​wszystkie ViewControllers Mając na stosie, które są związane z autorotacji musi wywołać metody super w implementacjach metod (tj. wywoływanie [super viewDidLoad] z ViewController's viewDidLoad).

Możesz użyć poniższej sztuczki do obsługi zmian orientacji.

Zarejestruj notifier w viewWillAppear.

-(void)viewWillAppear:(BOOL)animated{ 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];} 

Zmiana orientacji spowoduje wyświetlenie poniższej funkcji.

- (void)orientationChanged:(NSNotification *)notification{ 
[self handleOrientation:[[UIApplication sharedApplication] statusBarOrientation]];} 

, który wywoła poniższą metodę, w której można obsłużyć zmiany orientacji.

- (void) handleOrientation:(UIInterfaceOrientation) orientation { 

     if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) 
     { 
      //handle the portrait view  
     } 
     else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
     { 
      //handle the landscape view 
     } 
    } 
+0

Przyczyna nr 2 rozwiązała mój problem ... Super musi się nazywać – lucaslt89

4

znalazłem fragment dotyczący dokumentacji Apple:

Jeśli zawartość Państwa zdanie kontrolera nie są na ekranie, gdy następuje obrót, to nie widzi listę wiadomości obrotu. Rozważmy na przykład następującą sekwencję zdarzeń:

  • Twój kontroler widoku wyświetla na pełnym ekranie pełną zawartość kontrolera widoku.
  • Użytkownik obraca urządzenie, zmieniając orientację interfejsu użytkownika.
  • Twoja aplikacja odrzuca przedstawiony kontroler widoku.

W tym przykładzie kontroler widoku prezentacji nie był widoczny podczas obrotu, więc nie otrzymał żadnych zdarzeń rotacji. Zamiast tego, po ponownym wyświetleniu, jego widoki są po prostu zmieniane i pozycjonowane przy użyciu normalnego procesu wyświetlania widoku. Jeśli twój kod układu musi znać aktualną orientację urządzenia, może odczytać właściwość statusBarOrientation obiektu aplikacji, aby określić aktualną orientację.

że powiedzieć dokładnie to, co jest moim problemem, więc dodać trochę logiki wewnątrz - (void) viewWillAppear: (BOOL) animated dostosować mój układ jeśli coś is'n we właściwym miejscu.

0

Upewnij się, że kontroler widoku został dodany jako element podrzędny kontrolera widoku głównego, a następnie wiadomości są przekazywane.

[rootViewController addChildViewController:viewController];