Проблемы с ориентацией на 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.

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

Другие вопросы по тегам