Знание ориентации интерфейса iPad при запуске приложения - PullRequest
1 голос
/ 28 февраля 2012

Я пытаюсь определить ориентацию моего iPad при запуске на плоском столе.

Я всегда говорю, что он начинается в портретном режиме, что не соответствует действительности.

Я использовал выбранный код здесь , чтобы определить ориентацию при запуске.

Так получилось, что когда мое устройство на плоской поверхности обращено вверх, оно заявляет, что находится в портретном режиме. Однако строка состояния визуально находится в ландшафтном режиме.

Есть ли способ обойти это?

Я использую iOS 5 и Xcode 4.3.

РЕДАКТИРОВАТЬ: Подробнее

Вот мой метод ориентации обновления:

- (void)updateOrientation {

    UIInterfaceOrientation iOrientation = self.interfaceOrientation;//[[UIApplication sharedApplication] statusBarOrientation];
    UIDeviceOrientation dOrientation = [UIDevice currentDevice].orientation;

    bool landscape;

    if (dOrientation == UIDeviceOrientationUnknown || dOrientation == UIDeviceOrientationFaceUp || dOrientation == UIDeviceOrientationFaceDown) {
        // If the device is laying down, use the UIInterfaceOrientation based on the status bar.
        landscape = UIInterfaceOrientationIsLandscape(iOrientation);
    } else {
        // If the device is not laying down, use UIDeviceOrientation.
        landscape = UIDeviceOrientationIsLandscape(dOrientation);

        // There's a bug in iOS!!!! http://openradar.appspot.com/7216046
        // So values needs to be reversed for landscape!
        if (dOrientation == UIDeviceOrientationLandscapeLeft) iOrientation = UIInterfaceOrientationLandscapeRight;
        else if (dOrientation == UIDeviceOrientationLandscapeRight) iOrientation = UIInterfaceOrientationLandscapeLeft;

        else if (dOrientation == UIDeviceOrientationPortrait) iOrientation = UIInterfaceOrientationPortrait;
        else if (dOrientation == UIDeviceOrientationPortraitUpsideDown) iOrientation = UIInterfaceOrientationPortraitUpsideDown;
    }

    whiteView.hidden = NO;
    splashScreen.hidden = NO;
    if (landscape) {
        splashScreen.image = [UIImage imageNamed:@"Default-Landscape~ipad"];
    } else {
        splashScreen.image = [UIImage imageNamed:@"Default-Portrait~ipad"];
    }

    splashScreen.contentMode = UIViewContentModeScaleToFill;
    [self.view bringSubviewToFront:whiteView];
    [self.view bringSubviewToFront:splashScreen];

    // Set the status bar to the right spot just in case
    [[UIApplication sharedApplication] setStatusBarOrientation:iOrientation];
}

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

    if (splashScreen){
        [self updateOrientation];
        [UIView animateWithDuration:0.5 delay:1 options:UIViewAnimationOptionCurveEaseInOut 
                         animations:^{
                             splashScreen.alpha = 0;
                         } 
                         completion:^(BOOL success){
                             [splashScreen removeFromSuperview];
                             splashScreen = nil;
                         }];

        [UIView animateWithDuration:0.5 delay:1.5 options:UIViewAnimationOptionCurveEaseInOut 
                         animations:^{
                             whiteView.alpha = 0;
                         } 
                         completion:^(BOOL success){
                             [whiteView removeFromSuperview];
                             whiteView = nil;
                         }];
}

Проблема заметна, когда я запускаю свое приложение на плоской поверхности в ландшафтном режиме и вижу, что загружается неправильное изображение для экрана-заставки.

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

Используйте [[UIApplication sharedApplication] statusBarOrientation] вместо [UIDevice currentDevice] orientation].

Существует разница между ориентацией устройства и ориентацией интерфейса пользователя (и можно найти некоторые уточнения по этому связанному вопросу ).Многие приложения могут иметь пользовательский интерфейс, предназначенный для работы только определенными способами, даже если устройство указано другим способом.

2 голосов
/ 07 декабря 2012

У меня возникла та же проблема, и я не нашел никакого хорошего решения.

Кажется, что [[UIApplication sharedApplication] statusBarOrientation] всегда возвращает 1 до того, как application:didFinishLaunchingWithOptions: закончит работу, и только если ваше устройство обращено вверх(может быть, лицом вниз, я не пробовал)

Я наконец-то сделал это:

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

    // For the cases where device is not face up.
    if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        [self doTheJobInPortrait];
    else
        [self doTheJobInLandscape];

    // For the cases where device is face up
    [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(hackForFaceUpLandscapeDevices) userInfo:nil repeats:NO];
}

-(void)hackForFaceUpLandscapeDevices {
    if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        [self doTheJobInPortrait];
    else
        [self doTheJobInLandscape];
}

Конечно, работа будет выполнена два раза, и в режиме Lanscape лицом вверхнедолгое время, когда ваш интерфейс будет в портретной ориентации ...

Если кто-то найдет лучшее решение, я был бы рад узнать его.

0 голосов
/ 28 февраля 2012

Вот почему при запуске часто используется «пустое представление», которое просто инициализирует ваше приложение. Когда первый вид загружен, вы можете легко проверить правильность ориентации устройства.

После этого вы загружаете свой вид, ориентированный на ориентацию устройства. Итак, у вас есть:

Один ViewController Один пустой вид Два представления с содержанием (один пейзаж, один портрет)

Я думаю, э. г. Safari Mobile делает это таким образом.

...