Pasek stanu jest Krajobrazowy, ale [[UIApplication sharedApplication] statusBarOrientation] zwraca portret

Ten problem wydaje się być przerywany, ale nie jestem pewien, dlaczego dokładnie. Podczas uruchamiania aplikacji na urządzeniu (iPad), mam pewien kod, aby załadować widok przewijania z niektórymi widokami obrazu zgodnie z bieżącą orientacją urządzenia. Nawet jeśli urządzenie jest poziome przed załadowaniem, widoki są ładowane tak, jakby były pionowe.

Orientację można znaleźć wywołując [[UIApplication sharedApplication] statusBarOrientation].

Widoki są ustawione tak, aby dostosować ich pozycje, gdy urządzenie jest obracane, i rzeczywiście, obracanie do pozycji pionowej, a następnie z powrotem do poziomej, przywraca je do prawidłowych pozycji poziomych. Czy jest tak, że wszystkie aplikacje zaczynają się w pionie, a wkrótce w razie potrzeby zmieniają się na poziome? Czy próbuję sprawdzić orientację za wcześnie (podczas init pierwszego kontrolera widoku, który ma być załadowany)?

Author: Stuart, 2011-04-27

5 answers

Jeśli podklasujesz UIWindow lub pasek stanu, zobaczysz to, ponieważ jest to natywna orientacja urządzenia ipad. UIWindow tłumaczy orientację i współrzędne na to, do czego jesteśmy przyzwyczajeni. Po dokonaniu makeAndKeyVisible orientacja urządzenia i interfejsu w kontrolerach widoku powinna być zgodna z oczekiwaniami. Czy przypadkiem nie używasz MTStatusBarOverlay, prawda? Przechodziłem przez to samo i wszystko poszło zgodnie z kolejnością instalacji.

 7
Author: Greg Combs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-03 04:07:39

OK naprawione.

Używając UINavigationController, kiedy popToViewController: animated: od widoku poziomego do widoku pionowego, widok docelowy wydaje się prawidłowy, ale pasek stanu, a także UIKeyboard utrzymuje konfigurację poziomą, robiąc prawdziwy bałagan.

Working around Po tysiącach rekomendacji na temat statusbarrecjonowanie i referencje Czytaj... https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html

" metoda setStatusBarOrientation: animated: nie jest przestarzała wprost. Teraz działa tylko wtedy, gdy wspierany interfejs metoda najwyższego kontrolera widoku pełnoekranowego zwraca 0. To sprawia, że rozmówca jest odpowiedzialny za zapewnienie, że pasek stanu orientacja jest spójna." (dzięki Vytis W tutaj)

StatusBarOrientation działa tylko wtedy, gdy supportedinterface orientations zwraca 0, więc... to daje nam zgadywankę.

Jeśli statusbarorientacja nie jest zgodna z oczekiwaniami, jeden zwrot zerowy to zrobi (jeśli zawsze zwróci 0, widok nie będzie się obracał, więc:

// if deviceOrientation is A (so I expect statusbarOrientation A
// but statusbarOrientation is B
// return 0
// otherwise 
// return user interface orientation for A

- (NSUInteger)supportedInterfaceOrientations {
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    UIInterfaceOrientation statusBarOrientation =[UIApplication sharedApplication].statusBarOrientation;
    if(deviceOrientation == UIDeviceOrientationPortrait || deviceOrientation == UIDeviceOrientationPortraitUpsideDown){
        if(statusBarOrientation != UIInterfaceOrientationPortrait ||statusBarOrientation != UIInterfaceOrientationPortraitUpsideDown){
             return 0;
        }
    }
    // otherwise
    return UIInterfaceOrientationMaskPortrait;
}

Teraz, w viewDidAppear (uwierz mi, używam tego połączenia nawet wtedy, gdy powiadomienie klawiatury jest odbierane:

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
Ponad 48 godzin pracy. Mam nadzieję, że to pomoże, dzięki wszystkim.
 35
Author: SubstanceMX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 15:57:42

Na wypadek, gdyby ktoś inny natknął się na to, widzę wiele aplikacji, które mają podobne problemy w iOS5, właściwie na iPhone.

Może to być błąd w iOS 5 lub po prostu ingerencja w zwykłe zachowanie...

Używam niestandardowej klasy kontrolera widoku głównego (podklasa UITabBarController, Nie wiem, czy to ma znaczenie) i w tej klasie nadpisałem "shouldAutorotateToInterfaceOrientation", aby zacząć obracać się dopiero po zakończeniu mojej początkowej konfiguracji ekranu (robienie innych rzeczy namieszało up).

Teraz ponownie używam tej klasy, aby ręcznie ustawić statusBarOrientation na portrait, zanim zezwolę na obroty i na cokolwiek obróci się UI później.

[[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation animated:YES];

Wierzę, że to również może rozwiązać ten problem, nawet jeśli przyczyna może być niezwiązana.

 4
Author: coolio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-16 00:12:48

Jeśli masz ten problem w czasie uruchamiania, musisz użyć UIDevice, aby uzyskać orientację urządzenia, ponieważ statusbarorientacja będzie zawsze pionowa aż do po aplikacji: didFinishLaunchingWithOptions:. Jedynym zastrzeżeniem jest to, że musisz wcześniej włączyć powiadomienia o orientacji urządzenia lub poprosić UIDevice o orientację.

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
 1
Author: Mark Krenek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 20:04:56

Czy upewniłeś się, że masz wszystkie te informacje.plist ?

<key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
 0
Author: honcheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-03 01:59:56