2013-01-17 9 views
6

Mam UIViewController obsługujący kilka UIImageViews w widoku głównym. Na dole znajduje się pasek UIToolbar z kilkoma elementami, z którymi można się komunikować.Wykryj obrót interfejsu na UIViewController, nawet jeśli nie jest zdefiniowany w - (NSUInteger) supportedInterfaceOrientations

Teraz, gdy obracam urządzenie, nie chcę, aby kontroler viewController się obracał, ale tylko UIImageViews. Innymi słowy, pasek narzędzi na dole byłby po lewej (lub po prawej), ale obrazki byłyby obracane poprawnie.

Tak więc, za pomocą metod

- (BOOL)shouldAutoRotate { 
    return YES; 
} 

połączeniu z

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

i

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
// rotate the image views here 
} 

dowolny obrót urządzenia nie będą wykonywane, ponieważ tylko jedna orientacja interfejs obsługiwane (UIInterfaceOrientationMaskPortrait). Ale kiedy dodaję inną orientację interfejsu do obsługi w metodzie supportedInterfaceOrientations, kontroler widoku również się obróci.

Jak wykryć obrót dla kontrolera widoku, nawet jeśli obsługiwana jest tylko jedna orientacja? Czy istnieje kolejna możliwość obracania UIViews na podstawie zmieniającej się orientacji urządzenia?

Dzięki za pomoc!

+0

Znaleźliśmy odpowiedź - oczywiście - 10 sekund później tutaj: ht tp: //stackoverflow.com/questions/14387735/can-i-observe-when-a-uiviewcontroller-changes-interfaceorientation – uruk

Odpowiedz

8

Spróbuj użyć instancji UIDevice, aby wykryć zmiany w fizycznej orientacji urządzenia. Aby zacząć odbierać powiadomienia można użyć mniej więcej tak (w viewWillAppear: metody przykładowo):

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

    //No reason to ask NSNotification because it many cases `userInfo` equals to 
    //@{UIDeviceOrientationRotateAnimatedUserInfoKey = 1;} 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceDidRotate) name:@UIDeviceOrientationDidChangeNotification object:nil]; 
} 

Dla wyrejestrowanie odbierania zdarzeń obrotowe urządzenie, użyj tego (w viewWillDisappear: na przykład):

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

I jest to przykład funkcji deviceDidRotate:

- (void)deviceDidRotate { 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    switch (orientation) { 
     case UIDeviceOrientationPortrait: 
     case UIDeviceOrientationPortraitUpsideDown: 
      // do something for portrait orientation 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
     case UIDeviceOrientationLandscapeRight: 
      // do something for landscape orientation 
      break; 

     default: 
      break; 
    } 
} 
Powiązane problemy