Как мы определяем ориентацию приложения в iOS 8?
В iOS 7 мы сказали:
// ViewController1:
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
-(BOOL)shouldAutorotate {
return YES;
}
// ViewController2, presented by modal segue from button in ViewController1
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
-(BOOL)shouldAutorotate {
return YES;
}
В результате оказалось, что приложение появилось в ландшафтном представлении контроллера 1 и в портрете в виде контроллера 2.
Этот код отлично работает в iOS 7, включая симуляторы iOS 7 в Xcode 6. Но он больше не работает в iOS 8. Есть две проблемы:
-
Вид View Controller 1 отображается в ландшафте, но симулятор не поворачивается автоматически (может быть, просто ошибка симулятора) и (это действительно важная часть), изображение не изменяется автоматически, поэтому оно слишком узкий для экрана (там есть большая черная область справа).
-
Вид контроллера 2 выглядит в той же ориентации, что и просмотр контроллера 1 (пейзаж, а не портрет).
Таким образом, представления диспетчера просмотра не изменяются автоматически, чтобы заполнить экран, а поддерживаемые ориентации контроллера просмотра не выполняются.
Итак, как мы должны это делать сейчас? Это связано с коллекциями признаков? С предпочтительным размером контента? С настройкой ориентации строки состояния вручную?
Ответы
Ответ 1
Ответ на часть 1 (запуск в ландшафт) неизменен от iOS 7: все зависит от порядка возможных ориентаций в файле Info.plist. Итак, скажем, что View Controller 1 говорит следующее:
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
Затем мы будем последовательно внедряться в ландшафт, если ориентация ландшафта ориентирована на ориентированные на Info.plist ориентации интерфейса:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
</array>
Одним из примечательных изменений в iOS 8 является то, что по умолчанию строка состояния скрыта, когда мы находимся в ландшафте. Но вы можете предотвратить это, при желании, с соответствующим переопределением:
-(BOOL)prefersStatusBarHidden {
return NO;
}
Это не отвечает на вторую часть моего вопроса, а именно, как заставить вращение, когда представлен контроллер представления. Как я объяснил в этом ответе, я считаю, что это станет невозможным в iOS 8. Ожидается, что ваш контроллер просмотра и ваши взгляды будут "адаптироваться" - и так вы.
РЕДАКТИРОВАТЬ: Похоже, что в семени 4 возможность принудительного вращения приложения на представлении/увольнении диспетчера представлений возвращается!
Ответ 2
Проблема может возникнуть в вашем файле *.plist
Проверьте, что вы хотите, чтобы указать ориентацию по умолчанию/первый запуск для экрана как
Поддерживаемые ориентации интерфейса:
item 0 Пейзаж (кнопка правой кнопки)
позиция 1 Портрет (нижняя кнопка дома)
Эта "ошибка", которую я преследовал за несколько дней до того, как я, наконец, проверил работу UIInterface в глобальном поиске в Xcode и заметил, что у меня были ориентировки, которые моя игра не поддерживает (вся игра на 100% с правой стороны)
Я избавился от Landscape Left, который стал причиной запуска GameCenter в альбомный альбом Left Left, если я физически удерживал устройство в альбомной ориентации слева.
Проблема решена.