IOS 8 Ландшафтная ориентация: клавиатура отображается неправильно
У меня есть приложение, скомпилированное для iOS8. Приложение настроено на разрешение портретной ориентации только в настройках проекта. Взгляды приложения не поворачиваются к ландшафтному дизайну. В iOS7, когда вы поворачиваете устройство на пейзаж, клавиатура не поворачивается. Это поведение, которое я желаю.
Однако, в iOS8, когда вы поворачиваете устройство на пейзаж, клавиатура будет неправильно переключаться в альбомную ориентацию.
Я тестировал это на физическом iPhone 6 Plus, чтобы подтвердить эту проблему. Также протестировали его на iPhone 5 с помощью симулятора. Любая идея, как решить эту проблему?
ПОТЕНЦИАЛЬНЫЙ FIX
Я не помню точно, почему я это делал, но у меня есть код начальной загрузки, который запускается при запуске приложения:
d.window.rootViewController = tabBarController;
Где tabBarController - это контроллер панели верхнего уровня для приложения. Удаление этого кода начальной загрузки устраняет проблему.
![enter image description here]()
ПРЕДЛАГАЕМАЯ ДЕБЮГИНГ
Пока это не было в предыдущих версиях iOS, похоже, что iOS8 ведет себя по-другому. Я бы рекомендовал проверить любой загрузочный код, который у вас есть. Возможно, вам придется попробовать образец проекта и добавить несколько бит, пока не найдете виновника, поскольку в моем случае было довольно сложно отследить его. Два ответа, приведенные ниже, являются скорее фиксированием симптомов, а не причиной, поэтому я не отметил их как правильные.
Ответы
Ответ 1
У меня есть аналогичная проблема, и я обнаружил, что pre iOS8 ориентация клавиатуры привязана к ориентации строки состояния, но, к сожалению, в iOS8 ориентация клавиатуры и состояния не является отдельной. Хотя это не помогает решить вашу проблему, надеюсь, это дает немного информации о том, почему это происходит.
Изменить:
Попробуйте следующий код - это сработало для меня. Основываясь на том, какие ориентации разрешены, вам придется изменить, каким образом вы, очевидно, переворачиваете устройство.
// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
// This is because rotating the device to the left requires rotating the content to the right.
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
Ответ 2
Я столкнулся с той же проблемой, о которой говорил Carles Estevadeordal на устройстве iOS 8 для приложения, разработанного для iOS 7.
После небольшого расследования я обнаружил, что приложение вызывает следующий метод UIViewController,
"+ (void) попыткаRotationToDeviceOrientation"
Описание этого метода, приведенного в интерфейсе пользовательского интерфейса,
"если текущая ориентация интерфейса не соответствует текущей ориентации устройства, может произойти поворот"
Просто комментируя этот вызов метода, проблема была решена.
Ответ 3
Это не ошибка iOS8 или iPhone 6. Это проблема правильной миграции старых проектов на xCode6.
Вам просто нужно добавить ключ базового имени файла интерфейса экрана запуска в файл Info.plist.
Подробное объяснение этого случая вы можете найти здесь.
Ответ 4
Моя проблема похожа на вопрос, я связал решение Emmo213, но ошибка, кажется, идет случайным образом, и это не работает, проблема в моем случае, похоже, влияет только на iPhone 6 Plus. Я решил дать ответ, потому что он может помочь кому-то, если я найду его, я отредактирую ответ.
![iPhone 6 Plus Keyboard disappearing and wrongly placed randomly]()
Изменить: нашел решение, проблема определенно не возникает, когда приложение не работает в масштабированном режиме:
Как создать образы запуска для iPhone 6/6 Plus только для ландшафтных приложений?
Редактировать: это определенно не решение, так как проблема возникает случайно.
Я попробовал решение Emmo213 для проблемы, и это устранило проблему для меня, но потом я удалил эту часть кода и не смог снова воспроизвести проблему...
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
UIDeviceOrientation deviceOrientation;
switch (toInterfaceOrientation) {
case UIInterfaceOrientationLandscapeLeft:
deviceOrientation=UIDeviceOrientationLandscapeRight;
break;
case UIInterfaceOrientationLandscapeRight:
deviceOrientation=UIDeviceOrientationLandscapeLeft;
break;
case UIInterfaceOrientationPortrait:
deviceOrientation=UIDeviceOrientationPortrait;
break;
case UIInterfaceOrientationPortraitUpsideDown:
deviceOrientation=UIDeviceOrientationPortraitUpsideDown;
break;
default: deviceOrientation=UIDeviceOrientationUnknown;
break;
}
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:deviceOrientation] forKey:@"orientation"];
}
}
Я надеюсь, что это может помочь кому-то, но поскольку это похоже на редкое поведение с ошибкой, которое трудно воспроизвести, я не могу гарантировать, что это приемлемое решение...
Ответ 5
В основном это ошибка в Xcode 6, чтобы избежать этого, вы можете создать свой проект с помощью Xcode 5 или с помощью Xcode 7. Я попытался использовать xcode5 и xcode7-бета, и в обеих версиях проблемы с клавиатурой не было. Но когда я строю с помощью xcode 6, возникает проблема, поэтому попробуйте построить проект с помощью Xcode 5 или Xcode7 (скоро будет доступна стабильная версия Xcode7). Надеюсь, это поможет.