2012-10-17 11 views
6

Mam niestandardowy kontroler widoku podzielonego w mojej aplikacji z głównym kontrolerem i szczegółowym kontrolerem.Obsługa różnych orientacji w systemie iOS 6.0 dla różnych kontrolerów widoku

- (id)initWithMasterController:(UIViewController*)aMasterController 
      detailedController:(UIViewController*)aDetailedController; 

Kontrolery przewidziane głównego sterownika i kontrolera dane są UINavigationController.

jako część mojej aplikacji, możliwe są dwa przypadki dotyczące obchodzenia Orientacja:

  1. Kiedy sześć kombinacji kontrolerów wykorzystywane są w głównej i dane kontrolera, wszystkie kierunki są obsługiwane przez aplikację.
  2. Jeśli istnieje sam StudentDetailsViewController w sterowniku detali, obsługiwane są tylko dwie możliwe orientacje. (Pejzaż)

Gdy kiedykolwiek orientacja urządzenia jest zmieniony, poniższe rzeczy dzieją się w wersjach poniżej iOS 6.0

  1. Sposób -shouldAutorotateToInterfaceOrientation: zostanie wywołany. Implementacja tej metody jest poniżej: W czasie wykonywania przekazuję żądanie do kontrolera głównego i kontrolera szczegółów z tym samym wywołaniem.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
        BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation] 
           && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
        return res; 
    } 
    
  2. masterController na -shouldAutorotateToInterfaceOrientation zwróci TRUE. Implementacja metody w StudentViewController jest poniżej.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
        return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation) 
            : UIInterfaceOrientationIsPortrait(interfaceOrientation); 
    } 
    

zdolność do uzyskania informacji na temat nowej orientacji zostać zmienione pomaga mi zdecydować, czy obrót powinien być włączony czy nie.

z iOS 6.0:

Gdy kiedykolwiek orientacja urządzenia jest zmieniony, poniższe rzeczy dzieją się w wersji iOS 6.0

  1. metody -shouldAutorotate kontrolera widoku podzielonego zostanie wywołany. Jego realizacja jest poniżej

    - (BOOL)shouldAutorotate { 
        BOOL res = [masterController shouldAutorotate] 
           && [detailedController shouldAutorotate]; 
        return res; 
    } 
    
  2. na detailedController za shouldAutorotate wywołuje navigationController. Realizacja funkcji AutoRotate w StudentsController:

    - (BOOL)shouldAutorotate { 
        return YES; 
    } 
    
    - (NSUInteger)supportedInterfaceOrientations { 
        return (UIInterfaceOrientationMaskLandscapeLeft 
          | UIInterfaceOrientationMaskLandscapeRight); 
    } 
    

Ale z iOS 6.0, nie jestem w stanie kontrolować orientację. Mimo że wywoływana jest metoda supportedInterfaceOrientations, po wywołaniu metody shouldAutorotate metody StudentsDetailsController, metoda shouldAutorotateMethod nie przestrzega opcji wymienionych w metodzie supportedInterfaceOrientations.

UPDATE:

Czytam docs i poniższe uwagi są w document.

Czasami możesz chcieć dynamicznie wyłączyć automatyczny obrót. W przypadku przykładu możesz to zrobić, gdy chcesz całkowicie wyłączyć rotację przez krótki czas. Musisz tymczasowo wyłączyć zmiany orientacji, aby ręcznie kontrolować pozycję paska stanu (na przykład, gdy wywołujesz metodę setStatusBarOrientation: animated: method).

Aby tymczasowo wyłączyć automatyczny obrót, należy w tym celu uniknąć manipulowania maskami orientacji przez . Zamiast tego należy przesłonić metodę 01AshouldAutorotate na najwyższym kontroler widoku. Ta metoda jest wywołana przed wykonaniem jakiejkolwiek autorotacji. Jeśli zwróci wartość NIE, wówczas obrót zostanie wyłączony.

Czy można tymczasowo wyłączyć automatyczne obracanie na podstawie bieżącej orientacji?

+0

Formatowanie kodu nie może być zrobione poprawnie .. – Krishnan

+0

Czy rozwiązał problem? Mam ten sam problem i nie mogę wymyślić, jak sobie z tym poradzić zarówno dla ios5, jak i 6 – Stas

+0

Nie, nie rozwiązałem go. – Krishnan

Odpowiedz

0

Wierzę, że jest to pewien problem w iOS, gdzie rootViewController nie konsultuje childViewController dla ich preferowanej orientacji. Jednakże, należy spróbować czegoś tak:

if (self.interfaceOrientation != UIInterfaceOrientationPortrait) 
{ 
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait]; 
} 

aby zmienić orientację z powrotem do portretu dla danego widoku.

0

W swojej klasie delegatów aplikacji zdefiniuj następującą metodę, ta metoda zostanie wywołana przed innymi metodami rotacji w aplikacji.

Utwórz flagę (isRotationEnabled), która decyduje o orientacji Twojej aplikacji.

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {  

return self.isRotationEnabled ? 
    UIInterfaceOrientationMaskAll : 
    UIInterfaceOrientationMaskPortrait; 
} 

Zmiana ta flaga na podstawie różnych warunków w ciebie aplikację za pomocą następującego kodu

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.isRotationEnabled = NO;