2012-10-04 13 views
6

Chcę obsługiwać obrót w systemie iOS 6. Problem polega na tym, że przeglądałem wiele dokumentacji i pytań związanych z przepełnieniem stosu, ale nie znalazłem żadnych nawet drobnych rozwiązań. Mam tylko zauważyć, że mam dodać te dwie metody moim zdaniem klas Controller - jednak, jeśli się nie mylę, nie działają w taki sam sposób jak wcześniej iOS 6 Metody:iOS 6 Obrót: Przesyłanie kontrolera widoku

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAll; // use what is appropriate for you. 
} 

My Aplikacja obecnie obraca się w systemie pre-iOS6 przy użyciu następującego kodu. Zwróć uwagę, że używam parametrów orientacji interfejsu, aby określić, czy zamierzam przesłać mój kontroler widoku. Jak mogę to wdrożyć w delegatach rotacji systemu iOS 6?

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    UIInterfaceOrientation toOrientation = self.interfaceOrientation; 

    if (self.tabBarController.view.subviews.count >= 2) 
    { 
     UIView *tabBar = [self.tabBarController.view.subviews objectAtIndex:1]; 

     if(toOrientation != UIInterfaceOrientationLandscapeLeft && toOrientation != UIInterfaceOrientationLandscapeRight) 
     { 
      CUSTOM_DEBUG_LOG("\n\nRotated back to Portrait"); 
      tabBar.hidden = FALSE; 
     } 
    } 
} 

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     CUSTOM_DEBUG_LOG("\nView going landscape"); 
     ScrollViewController *s = [[ScrollViewController alloc] initWithNibName:@"ScrollViewController" bundle:nil]; 
     [self.navigationController pushViewController:s animated:NO]; 
     [s release]; 
     self.tabBarController.tabBar.hidden = YES; 
     self.navigationController.navigationBar.hidden = YES; 
    } 

} 
+1

Zobacz film WWDC 2012 na temat kontrolerów widoku. – matt

+0

Myślę, że nie sformułowałem poprawnie mojego pytania, ponieważ moja aplikacja działa bez żadnej odpowiedzi tutaj. Zasadniczo nie byłem w stanie uzyskać rotacji działającej w systemie iOS i pomyślałem, że funkcje willAnimate ... również są przestarzałe. Okazuje się, że nie są. Moja aplikacja nadal działa. Brawo? Niestety, na mojej stronie mam gigantyczne, brzydkie białe paski, których muszę się pozbyć. Czas zadać kolejne pytanie. –

Odpowiedz

3

kasę this i this SO dyskusji.

[EDIT]

Tak ty wymienione metody nie są przestarzałe w iOS 6.0 i będą kontynuować pracę. Po prostu sposób pracy Auto Rotation został zmieniony. Do tej pory kontrolerami widoku byli odpowiedzialni decydowanie, czy obracają się, czy nie, ale teraz RootViewController decyduje, czy ich dzieci powinny się obracać, czy nie. Jeśli nie masz konfiguracji rootviewcontroller, musisz dodać ją do okna, a następnie umieścić metody shouldAutoRotate i supportedInterfaceOrientations w rootviewcontroller.

+0

Jeśli się nie mylę, wygląda na to, że po prostu przeniesienie kodu z mojej funkcji willAnimate do innej funkcji, która wygląda ładniej, ale funkcjonalnie nie robi nic więcej. –

+0

Przepraszam, że źle zrozumiałem twoje pytanie. Zmieniono moją odpowiedź. – applefreak

+0

Ja to wezmę! Dzięki :) –

3

Parent Odwiedzin teraz obsługiwać obrót w iOS 6. Subclass kontrolerów nav i dodać Bool

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; // your rotation here 
} 
+0

Nie jestem pewien, czy rozumiem. Czy mógłbyś podać mi przykładowy kod lub pokazać, jak poradziłbym sobie z popychaniem moich kontrolerów widoku? Dosłownie przykleiłeś do mnie pierwszy blok kodu (z nieco innym powrotem), co wcale mi nie pomaga. Powinienem wspomnieć, że powodem, dla którego pcham oddzielny kontroler widoku dla trybu poziomego, jest to, że interfejs krajobrazowy jest zupełnie inny niż portret. –

+1

Możesz rozważyć przepisanie tego kodu, aby zmienić układ po obrocie. Jeśli inny interfejs użytkownika ma te same komponenty, które byłyby proste.Jeśli istnieją różne komponenty, możesz odpowiednio pokazać/ukryć. Jeśli naprawdę chcesz zachować oddzielne kontrolery widoku, prawdopodobnie najlepiej by działało, gdyby był nadrzędny kontroler widoku, który dodawał/usuwał i/lub pokazywał/ukrywał odpowiedni kontroler widoku podrzędnego na rotacji ... w ten sposób nie mieć do czynienia z funkcjonalnością podglądu kontrolerów push/popping na rotacji. – Matt

+0

Czy pchanie/popping nieefektywne lub coś wysoce niepożądanego? Aplikacja jest bardzo podobna do aplikacji muzycznej iPhone'a, gdzie jeśli przechylisz się w bok na każdym z kontrolerów widoku na pasku zakładek (tak, moja aplikacja ma pasek zakładek), zostaniesz wrzucony w coverflow. Dla mojej aplikacji zostaniesz wrzucony do mojego kontrolera widoku krajobrazu. Wygląda na to, że działa dobrze w systemie iOS 5 i starszym, ale staram się wymyślić pewne rzeczy na iOS 6. Muszę też zachować kompatybilność ze starszymi wersjami iOS. –

1

Prawdopodobnie nie zaimplementowałem poprawnie kodu obrotu iOS6, kiedy po raz pierwszy opublikowałem pytanie.

Niepoprawnie pomyślałem, że funkcja willAnimateRotationToInterfaceOrientation została wycofana w iOS6, co doprowadziło mnie do przekonania, że ​​istnieje nowy delegat obrotu iOS z parametrem orientacji. Okazuje się, że tak nie jest, więc moja aplikacja działa.

Kod podłączyłem do mojej aplikacji właśnie to:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight); 
} 
+0

+1 dla funkcji "kopiuj i wklej". Nie ma ochoty sprawdzać składni masek orientacyjnych łączących składnię ... –

+2

Wartość wygody UIInterfaceOrientationMaskAllButUpsideDown jest jeszcze bardziej czytelna. – eclux

1

Jeśli używasz UINavigationController, zastępują shouldAutomaticallyForwardRotationMethods = YES nieruchomości.

Następnie, tak jak powiedział Mark S, należy również zastąpić shouldAutorotate i supportedInterfaceOrientations dla potomnych VC.

+0

Nice! Dobry połów. Dam ci upboat (: –

Powiązane problemy