Подтвердить что ты не робот

IOS 8 Ландшафтная ориентация: клавиатура отображается неправильно

У меня есть приложение, скомпилированное для iOS8. Приложение настроено на разрешение портретной ориентации только в настройках проекта. Взгляды приложения не поворачиваются к ландшафтному дизайну. В iOS7, когда вы поворачиваете устройство на пейзаж, клавиатура не поворачивается. Это поведение, которое я желаю.

Однако, в iOS8, когда вы поворачиваете устройство на пейзаж, клавиатура будет неправильно переключаться в альбомную ориентацию.

Я тестировал это на физическом iPhone 6 Plus, чтобы подтвердить эту проблему. Также протестировали его на iPhone 5 с помощью симулятора. Любая идея, как решить эту проблему?

ПОТЕНЦИАЛЬНЫЙ FIX

Я не помню точно, почему я это делал, но у меня есть код начальной загрузки, который запускается при запуске приложения:

    d.window.rootViewController = tabBarController;

Где tabBarController - это контроллер панели верхнего уровня для приложения. Удаление этого кода начальной загрузки устраняет проблему.

enter image description here

ПРЕДЛАГАЕМАЯ ДЕБЮГИНГ

Пока это не было в предыдущих версиях iOS, похоже, что iOS8 ведет себя по-другому. Я бы рекомендовал проверить любой загрузочный код, который у вас есть. Возможно, вам придется попробовать образец проекта и добавить несколько бит, пока не найдете виновника, поскольку в моем случае было довольно сложно отследить его. Два ответа, приведенные ниже, являются скорее фиксированием симптомов, а не причиной, поэтому я не отметил их как правильные.

4b9b3361

Ответ 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). Надеюсь, это поможет.