Проблемы с ориентацией на iOS 8: клавиатура оказалась в неправильном положении
У меня есть универсальный проект для iOS, созданный в xCode 5, который я пытаюсь перенести на xCode 6. Кажется, все было хорошо, так как я не использую LaunchScreen
и iPhone 6 и 6 Plus масштабируют приложение до своих разрешений.
Проблема возникает, когда устройство меняет свою ориентацию.
Сценарий:
Это происходит только на iPhone 6 и 6 Plus.
Откройте экран входа в систему с полями имени пользователя и пароля. Поверните устройство в альбомную ориентацию и коснитесь поля имени пользователя или пароля. Клавиатура появляется в середине экрана с половинным вырезом. Поворот назад в портретный режим полностью скрывает клавиатуру и больше не отображается на экране независимо от того, к какому полю вы прикоснулись.
Чтобы вернуть клавиатуру, вернитесь обратно в альбомную ориентацию, нажмите на устройство для поворота поля в противоположную сторону альбомной ориентации (не позволяйте ему перейти в портретную ориентацию). Клавиатура вдруг становится нормальной и работает нормально.
5 ответов
У меня та же проблема, и это потому, что ваше приложение запускается в режиме масштабирования.
Похоже, что Apple не пошла полным путем, чтобы справиться с пейзажем в этом масштабном режиме.
Решение состоит в том, чтобы переключиться в немасштабированный режим для iPhone 6-6Plus, используя трюк, указанный здесь: Как включить собственное разрешение для приложений на iPhone 6 и 6 Plus?
Обратите внимание, что это, вероятно, сломает многие ваши экраны в процессе... но другого решения нет.
Я столкнулся с этой проблемой в масштабируемом режиме приложения. Хотя поддержка немасштабируемого режима (добавление изображений запуска iPhone 6 и 6+ в xcassets) решает эту проблему, в моем случае это было недопустимо, поскольку экраны имели статическое расположение для каждой ориентации. Я мог бы решить эту проблему, избегая случаев смены корневого контроллера представления окна. Вместо этого новые контроллеры представления были добавлены (с удалением балансировки) как подпредставление (и, следовательно, childViewController) к существующему корневому контроллеру представления.
Если ваше приложение работает только в портретном режиме, вы можете прекратить генерировать уведомления об ориентации;
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
Все хорошо на iOS6/7, но не iOS8.
Ориентация клавиатуры на iOS 8 отличается от строки состояния.
Я столкнулся с этой проблемой, и после некоторого исследования я нашел некоторые вещи, которые вызвали такую ошибку. В моем AppDelegate я изменил окно rootViewController, чтобы показать разные ViewControllers в зависимости от статуса авторизации
if (!auth)
{
self.window.rootViewController = [[AuthViewController alloc] init];
} else {
self.window.rootViewController = [[DataViewController alloc] init];
}
Я удалил это и переместил логику выбора контроллера в NavigationViewController
if (!auth)
{
self.viewControllers = @[[[AuthViewController alloc] init]];
} else {
self.viewControllers = @[[[DataViewController alloc] init]];
}
и сделать этот NavigationViewController в качестве контроллера начального представления Storyboard.
Надеюсь, поможет!