2010-11-19 7 views
9

Chciałbym obsłużyć zmianę orientacji na aplikacji na iPada z jednym kontrolerem UIViewController i dwoma XIB, powiedzmy MenuView i MenuViewLandscape.Zmiana orientacji uchwytu na iPadzie za pomocą jednego kontrolera UIViewController i dwóch XIB

A więc, w metodzie willRotateToInterfaceOrientation MenuViewController, w jaki sposób mogę zmienić XIB bez użycia innego kontrolera w trybie poziomym?

używam następujący kod:

if(toInterfaceOrientation != UIInterfaceOrientationPortrait){ 
    MenuViewController *landscape = [[MenuViewController alloc] 
             initWithNibName: @"MenuViewLandscape" 
             bundle:nil 
            ];   
    [self setView:landscape.view]; 
} 
else { 
    MenuViewController *potrait = [[MenuViewController alloc] 
            initWithNibName: @"MenuView" 
            bundle:nil 
            ];   
    [self setView:potrait.view]; 
} 

Ale kiedy idę do góry zobaczyć XIb krajobrazu widok kontrole nie są prawidłowo obrócone.

+0

Wszelkie szczęścia z tym? – RefuX

+0

zobacz odpowiedź poniżej –

Odpowiedz

12

Nie jestem pewien, czy są jakieś dziwne skutki uboczne z tego wdrożenia, ale spróbuj coś takiego i sprawdzić, czy to działa dla Ciebie:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration { 
    if (UIInterfaceOrientationIsPortrait(orientation)) { 
     [[NSBundle mainBundle] loadNibNamed:@"MenuView" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI); 
     } 
    } else if (UIInterfaceOrientationIsLandscape(orientation)){ 
     [[NSBundle mainBundle] loadNibNamed:@"MenuViewLandscape" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationLandscapeLeft) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); 
     } else { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI_2); 
     } 
    } 
} 

zakłada to, że plik jest Właściciel w MenuView i MenuViewLandscape XIB są ustawione zarówno na MenuViewController, jak i na to, że punkt widokowy jest ustawiony również na XIB. Wszystkie gniazda wyjściowe powinny być prawidłowo podłączone po obróceniu podczas używania loadNibNamed.

Jeśli budujesz dla iOS 4, można również wymienić loadNibNamed linie z nich:

UINib *nib = [UINib nibWithNibName:@"MenuView" bundle:nil]; 
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = portraitView; 

i

UINib *nib = [UINib nibWithNibName:@"MenuViewLandscape" bundle:nil]; 
UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = landscapeView; 

te zakładają, że UIView, że chcesz, aby natychmiast wyświetlić następuje po Obiekty proxy pliku i pierwszego obiektu odpowiadającego w XIB.

Następnie wystarczy upewnić się, że widoki są odpowiednio obrócone dla orientacji interfejsu. W przypadku wszystkich widoków, które nie mają domyślnej orientacji pionowej, należy je obrócić, ustawiając właściwość transform widoku i używając wartości CGAffineTransformMakeRotation() z odpowiednimi wartościami, jak pokazano w powyższym przykładzie.

Sam obrót może rozwiązać problem bez dodatkowego obciążenia NIB. Jednak załadowanie zupełnie nowego wystąpienia obiektu MenuViewController i ustawienie jego widoku na istniejący widok MenuViewController może spowodować dziwne zachowanie w przypadku zdarzeń cyklu życia i rotacji, więc bezpieczniejsze może być wypróbowanie powyższych przykładów. Pozwalają również zaoszczędzić sobie trudu tworzenia nowych instancji MenuViewController, gdy potrzebujesz tylko widoku z tego.

Mam nadzieję, że to pomoże!

Justin

+0

Witaj Justin.Wypróbowałem Twoje rozwiązanie i działa ono dobrze dla portretu. Jednak w przypadku krajobrazu wszystko jest rozmyte. Obracany poprawnie, ale z rozmytym tekstem i etykietami, wszystko prawie rozmyte. Niektóre linie są postrzępione. Jakieś pomysły ? Dziękuję Ci. – TrekOnTV2017

1

Być może odpowiedź od Jon Rodriguez tu będą robić to, co chcesz:

Want to use muliple nibs for different iphone interface orientations

Jeśli masz dwie klasy UIViewController klasa bazowa dla trybu portretowego i podklasy, że dla tryb krajobrazu, możesz umieścić prawie cały kod w klasie bazowej. Tak że daje większość zalet jednej klasy widoku kontrolera, a jednocześnie pozwala na użycie innych rozwiązań tak:

Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape?