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

Идентификация GameCenter в приложении только для ландшафта бросает UIApplicationInvalidInterfaceOrientation

Проблема: Если пользователь не входит в учетную запись GameCenter, то в режиме портретного режима запускается просмотр подлинности GameCenter (в ios 5 есть модальный диалог), требующий входа в систему. Но если я отключу режим Portrait в xcode (Project Summary) или в supportedInterfaceOrientationsForWindow: (as мое приложение должно работать только в ландшафтном режиме) Я получаю:

Завершение приложения из-за неперехваченного исключения "UIApplicationInvalidInterfaceOrientation", причина: "Поддерживаемые ориентации не имеют общей ориентации с приложением, а shouldAutorotate возвращает YES"

Если я включил Portrait для ipad/iphone (и/или закомментировал supportInterfaceOrientationsForWindow:), он работает без сбоев, но я не хочу, чтобы режим портрета был включен.

4b9b3361

Ответ 1

При написании этого вопроса и экспериментировании с кодом кажется, что я нашел решение: включить все ориентации в резюме проекта и удалить приложение: supportedInterfaceOrientationsForWindow.

Добавьте этот код в ViewController:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

Теперь он работает без проблем.

Ответ 2

Добавить в делегат приложения:

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

return (NSUInteger)[application supportedInterfaceOrientationsForWindow:w] | (1<<UIInterfaceOrientationPortrait);

}

Ответ 3

Я обнаружил, что проблема исходит из Game Center в моем случае. Когда в симуляторе я еще не инициализировал игровой центр, он хотел бы открыть окно входа в систему, но в портретном режиме. Как только он достигнет этого момента, он сработает, если я откажусь от портретной ориентации. Странная ошибка в ОС, поскольку Game Center должен принимать разрешенные ориентации только для того, чтобы быть встроенным с нашим намерением ландшафтного пользовательского интерфейса.

У меня пока нет решения, но я отправлю сообщение, если найду его.

Ответ 4

У меня была такая же проблема, как и вы, и я исправил ее с помощью некой, уродливой работы, в основном у меня есть глобальная переменная в моем приложении, которую я использую, чтобы выбрать, каковы действительные ориентации интерфейса. В

    - (NSInteger)application : (UIApplication *)supportedInterfaceOrientationsForWindow:(UIWindow *)window{
          if(orientationIndicator == 1){
               return UIInterfaceOrientationMaskAllButUpsideDown;
          }
          else if(orientationIndicator == 2){
               return UIInterfaceOrientationMaskLandscape;
          }
     }

Чтобы объявить глобальную переменную, поместите это в файл appDelegate.m:

          int orientationIndicator = 1;

Чтобы импортировать глобальную переменную, используйте:

          extern int orientationIndicator;

Затем вы можете изменить значение индикатора ориентации, и оно позволит вам работать в разных типах интерфейсов. Итак, что я сделал, я начал с того, что сделал orientationIndicator = 1. Когда вы аутентифицируете игрока и инициируете контроллер входа в систему, установите индикатор ориентации на 2. Когда вы упустите представление (удостоверяете личность игрока), вы можете изменить его на 1.

Это плохая работа, но она сработала для меня.

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

Ответ 5

Поймать исключение, похоже, отлично работает для меня:

@try {
    [rootNavigationController pushViewController:viewController animated:YES];
}
@catch (NSException *exception) {
    //somehow, catching this exception just allows the view controller to be shown?
}

В iOS 6.0 исключение вызывается, но если вы его поймаете, то viewController все равно будет отображаться, и GameCenter будет вести себя так, как ожидалось, в альбомной ориентации.

Альтернативное решение предназначено только для iOS 6.1 и выше, поскольку Apple исправила ошибку этой версии.