2013-06-05 6 views
5

Wiem, że podobne pytania były już wcześniej zadawane, ale jest to bardziej szczegółowy przypadek użycia (kontrolowanie orientacji z biblioteki statycznej, nie można zapisać w kontrolerze widoku root).Utrzymywanie orientacji pionowej iOS z biblioteki statycznej tylko dla jednego kontrolera widoku

Mam statyczną bibliotekę, która dodaje elementy interfejsu użytkownika jako nakładki do przejętego kontrolera widoku (kontroler widoku głównego klienta) jako subviews. Problem polega na tym, że nasze elementy interfejsu użytkownika obsługują tylko orientację pionową, a aplikacja naszego klienta może obsługiwać zarówno portret, jak i krajobraz. To jest w porządku, o ile nasze elementy interfejsu użytkownika nie działają automatycznie, gdy robią to widoki naszych klientów.

Chciałbym ustawić orientację na pionową tylko dla naszego kontrolera widoku. W iOS 6, kiedy użyć następującego kodu w widoku kontrolera mojej biblioteki, to nie ma wpływu na zachowanie AutoRotate na wszystkich:

-(BOOL)shouldAutorotate{ 
return NO; 
} 

-(NSInteger)supportedInterfaceOrientations{ 
    NSInteger orientationMask = 0; 
    if ([self shouldAutorotateToInterfaceOrientation: UIInterfaceOrientationPortrait]) 
     orientationMask |= UIInterfaceOrientationMaskPortrait; 
    return orientationMask; 
} 

Kiedy kładę ten sam kod w kontroler widoku głównego, działa doskonale , z aplikacją, która nie jest już automatycznie obracana. Jednak nie jest to opcja dla nas, ponieważ w produkcji nie będziemy mieć dostępu do kontrolera widoku głównego klienta. Czy istnieje sposób blokowania orientacji widoku z NIE kontrolera widoku głównego lub orientacji blokowania tylko dla pojedynczego kontrolera widoku? Jakikolwiek inny sposób osiągnięcia tego, czego potrzebujemy, o czym nie myślę? Mając nadzieję na rozwiązania działające w iOS < = 6, jeśli to w ogóle możliwe,

+0

Jak można wyjaśnić urządzenia już w krajobrazie, gdy elementy są tworzone wystąpienia? –

+0

Czy kiedykolwiek znalazłeś rozwiązanie? –

Odpowiedz

0

Nie można zablokować orientacji tylko dla jednego kontrolera widoku w całej aplikacji. Więc musisz ustawić kąt transformacji z ramką widoku rodzica przy uruchomieniu widoku i zmianie orientacji.

dodać kod dla klasy widok kontrolera

- (void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
    [[self view] setBounds:CGRectMake(0, 0, self.view.frame.size.height, self.view.frame.size.width)]; 
    CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a); 
    if (radians!=M_PI_2) { 
     [[self view] setTransform:CGAffineTransformMakeRotation(M_PI_2)]; 

    } 

} 

}

  • (void) didRotateFromInterfaceOrientation (UIInterfaceOrientation) fromInterfaceOrientation {

    orientacji UIInterfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation ]; if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { [[self view] setBounds: CGRectMake (0, 0, self.view.frame.size.height, self.view.frame.size.width)] ; CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); if (radians! = M_PI_2) { [[self view] setTransform: CGAffineTransformMakeRotation (M_PI_2)];

    } 
    

    } else {

    [[widok siebie] setBounds: CGRectMake (0, 0, self.view.frame.size.width, self.view.frame.size.height)]; CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); if (radians! = 0) { [[self view] setTransform: CGAffineTransformMakeRotation (0)];

    } 
    

    } }