Идентификация GameCenter в приложении только для ландшафта бросает UIApplicationInvalidInterfaceOrientation
Проблема:
Если пользователь не входит в учетную запись GameCenter, то в режиме портретного режима запускается просмотр подлинности GameCenter (в ios 5 есть модальный диалог), требующий входа в систему. Но если я отключу режим Portrait в xcode (Project Summary) или в supportedInterfaceOrientationsForWindow: (as мое приложение должно работать только в ландшафтном режиме) Я получаю:
Завершение приложения из-за неперехваченного исключения "UIApplicationInvalidInterfaceOrientation", причина: "Поддерживаемые ориентации не имеют общей ориентации с приложением, а shouldAutorotate возвращает YES"
Если я включил Portrait для ipad/iphone (и/или закомментировал supportInterfaceOrientationsForWindow:), он работает без сбоев, но я не хочу, чтобы режим портрета был включен.
Ответы
Ответ 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 исправила ошибку этой версии.