Подтвердить что ты не робот

Почему в iOS 8 мое приложение при запуске принимает неправильную ориентацию?

мое приложение до iOS 7 работает правильно. Я пробовал это сегодня с Xcode 6, и когда я запускаю его, у меня неприятный сюрприз: (:

enter image description here Вы можете видеть, что Xcode теперь нарисовал мой viewController, как если бы он был в портретном режиме, но, как вы можете видеть, он находится в ландшафтном режиме.

Знаете ли вы, что изменилось в iOS 8?:/ Я использовал следующие методы ориентации:

  • (NSUInteger) supportedInterfaceOrientations
  • (BOOL) shouldAutorotate
  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation

ИЗМЕНИТЬ:

Я просто открываю этот метод:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{
 return UIInterfaceOrientationMaskLandscape;
}

И теперь мои первые контроллеры view работают правильно:). проблема в том, когда я показываю модальный (который меняет набор методов в UIInterfaceOrientationMaskAll) переделывает уродливый эффект скриншота. Именно поэтому я меняю свои методы в этом режиме:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if(self.restrictRotation)
    {
        return UIInterfaceOrientationMaskLandscape;
    }    
    else
    {
        return UIInterfaceOrientationMaskAll;
    }
}


// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
    NSLog(@"updateInterfaceAfterDocumentPreviewViewController");

    [[UIApplication sharedApplication]     setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];

    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = YES;
}
4b9b3361

Ответ 1

Пожалуйста, попробуйте следующий код

В didFinishLaunchingWithOptions of AppDelegate

self.window.rootViewController = self.viewController;

[self.window makeKeyAndVisible];

[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add

Ответ 2

Проблема заключается в порядке вызовов при настройке окна. Вам нужно позвонить makeKeyAndVisible, прежде чем назначать rootViewController в вашем методе didFinishLaunchingWithOptions в делегате приложения. Следующие работы:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;

Но если вы измените порядок на:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];

Вы получаете поведение, которое вы испытываете.

Ответ 3

У меня была такая же точная проблема с "экраном загрузки". Это то, что сработало для меня. (Обратите внимание: мое приложение поддерживает только iOS 7 или более поздней версии, ландшафтный режим.):

    CGRect theFrame = self.view.frame;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
        CGRect screenBounds = [[UIScreen mainScreen] bounds];
        theFrame.origin = CGPointZero;
        theFrame.size.width = screenBounds.size.height;
        theFrame.size.height = screenBounds.size.width;
    }

    NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
    self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];

Пожалуйста, обратитесь к Майку Хэй, если ваше приложение поддерживает портретную ориентацию и "длинный путь для расчета правильной рамки приложения": fooobar.com/questions/239319/...

Надеюсь, что это поможет.

Ответ 4

Посмотрите на свой файл .plist.

  • Удостоверьтесь, что у вас есть "Ориентация начального интерфейса" в соответствии с желаемой ориентацией.
  • В разделе "Поддерживаемые ориентации интерфейса" предпочтительная ориентация в качестве первой записи в списке (похоже, что Apple изменила этот порядок).

Ответ 5

У меня была аналогичная проблема, я не мог получить правильные изображения запуска для показа (у меня было два для iPad, Default-Portrait.png и Default-Landscape.png), и я также не смог получить приложение для автоматической ориентации после исчезновения изображения запуска.

Чтобы решить проблему для изображений запуска:

  • Перейдите в раздел "Свойства целевых объектов iOS" проекта (нажмите на значок проекта в верхней части списка файлов проекта, и это должен быть первый раздел, который вы видите).
  • Добавьте строку в эту таблицу под названием "Запустить изображение" (необходимо автозаполнение) и введите "По умолчанию" в качестве строки в правом столбце.
  • Убедитесь, что ваши снимки запуска соответствуют рекомендациям Apple filename (например: Default-568 @2x, Default @2x и т.д.) проверьте этот ответ SO li >

Чтобы решить проблему ориентации приложения сначала ViewController:

  • Перейдите в файл plist проектов (должен быть "YourApp-Info.plist" )
  • Добавьте строку и введите "Поддерживаемые ориентации интерфейса"
  • Добавьте ориентации, поддерживаемые вашим приложением

Ответ 6

Этот подход к обнаружению ориентации был устарел в iOS8 (но до сих пор разрешен). Он был заменен концепцией классов классов и Trait Collections.

(Как ни странно, я не могу найти ссылку на класс класса в онлайн-документах Apple прямо сейчас - поклялся, что это было раньше - возможно, в XCode). См. здесь для видео WWDC.

Во всяком случае, в Interface Builder установлен флажок "Использовать классы размеров." Возможно, у вас это проверено. Выключите его и посмотрите, помогает ли это?

Ответ 7

Решение Oldschool:

BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
    CGFloat height = CGRectGetHeight(self.view.frame);
    CGFloat width = CGRectGetWidth(self.view.frame);
    if (width / height > 1.0) {
        portrait = NO;
    } else {
        portrait = YES;
    }
} else {
    portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
    [self layoutPortrait];
} else {
    [self layoutLandscape];
}

Вы можете вызвать это в viewWillLayoutSubviews

Ответ 8

UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;

if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
    {
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

        // -- Fix for rotation issue for ios 8
        if( IS_IOS_8_OR_LATER )
        {
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
                                                                 bundle: nil];
            // -- Set frame of nav controller
            UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];

            self.window.rootViewController = nc;

            [self.window setFrame:[[UIScreen mainScreen] bounds]];

            // -- Set fame of home view controller
            UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];

            self.window.rootViewController = vc;

            [self.window makeKeyAndVisible];

            [self.window setFrame:[[UIScreen mainScreen] bounds]];
        }
    }
}