2015-04-24 5 views
6

Я столкнулся с странными IOS 8.3 вопроса, который показывает клавиатуру на неправильную ориентацию, как это (контроллер вида находится в ландшафтном режиме, но клавиатура отображается в портретном режиме):IOS 8,3 клавиатуры ориентация ошибка

the view controller is in Landscape mode, but the keyboard show up in Portrait mode

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

  1. Создать 2 UIViewController подкласс: ViewControllerA и ViewControllerB

  2. в ViewControllerA реализации supportedInterfaceOrientations и вернуть UIInterfaceOrientationMaskPortrait

  3. ViewControllerB в реализации supportedInterfaceOrientations и вернуть UIInterfaceOrientationMaskLandscape

  4. Создать UINavigationController подкласс под названием NavigationController, осуществлять supportedInterfaceOrientations и вернуть [self.topViewController supportedInterfaceOrientations] (я это делаю, потому что я хочу, чтобы сохранить навигационный контроллер и его rootVC от вращения)

  5. U С.Е. NavigationController в качестве исходного контроллера вида приложения, установить ViewControllerA как NavigationController «ы rootViewContrller

  6. запустить приложение, ViewControllerA будет показанным в Портрете. Показать кнопку на ViewControllerA, нажмите кнопку представит ViewControllerB с помощью presentViewController:animated:completion

  7. ViewControllerB будет отображаться в ландшафтном; Покажите текстовое поле на ViewControllerB, нажмите на текстовое поле, вызывая клавиатуру, но клавиатура находится в режиме Портрет, как показано на рисунке выше.

PS. Вы можете загрузить и запустить проект Xcode on github

Эта проблема появляется только в iOS 8.3. Я делаю что-то неправильно ? Или, может быть, это еще одна ошибка iOS?

Кстати, эта проблема не будет, если вы просто покажите ViewControllerA без ViewController. Так что, если это ошибка iOS, как я могу избежать подкласса UINavigationController, но все равно сохраняю ViewControllerA, который является корневым контроллером вращения UINavigationController.


UPDATE: Эта ошибка по-прежнему появляется на прошивке 8.4, я выпустил отчет об ошибке и получил ответы от яблока на 17 июня 2015 года, они сказали, что это было адресовано в последней прошивке 9 беты.

ответ

2

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

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    self.segmentedControl.selectedSegmentIndex = 0; 
    if(!self.rotatingForDismissal) 
    { 
     [self.tableNumberTextField becomeFirstResponder]; 
    } 


    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.3")) 
    { 
     [[UIDevice currentDevice] setValue:@(UIDeviceOrientationLandscapeLeft) forKey:@"orientation"]; 
     [[UIDevice currentDevice] setValue:@(self.interfaceOrientation) forKey:@"orientation"]; 
    } 

} 
+0

Да! Это гораздо лучшее решение, чем мое. Спасибо ! – ultragtx

+0

Я использую GoogleMap 1.9.0 и все еще не работаю –

3

Я попросил техническую поддержку, и они сказали

Наши инженеры рассмотрели Ваш запрос и определили, что это было бы лучше всего выполнять в виде отчета об ошибке.

Похоже, что это подтверждено системной ошибкой.

И мое текущее решение добавляет ViewControllerC (поддерживает как портретный, так и альбомный режим) между ViewControllerA и ViewControllerB: ViewControllerA должен представить ViewControllerC с анимацией, после появления ViewControllerC, присутствует ViewControllerB без анимации.

Чтобы сделать переход естественным, вы можете установить тот же цвет фона, что и ViewControllerB, в ViewControllerC или сделать снимок экрана ViewControllerB и добавить его в ViewControllerC в качестве фонового изображения.

Это не идеальное решение, для пользователей они могут обнаружить, что ViewControllerB занимает больше времени для загрузки.

+0

Вы подали радар против этой проблемы? См. Ту же проблему из iOS 8.3 – user1165756

0

Я был в состоянии сделать клавиатуру правильной, используя следующее.

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (SYSTEM_VERSION_GREATER_THAN(@"7.1") && SYSTEM_VERSION_LESS_THAN(@"9.0")) 
    { 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    [[UIDevice currentDevice] setValue:@(UIDeviceOrientationUnknown) forKey:@"orientation"]; 
    [[UIDevice currentDevice] setValue:@(orientation) forKey:@"orientation"]; 
    } 
} 

Обратите внимание, что использование UIDeviceOrientationUnknown не вызывает побочных эффектов, таких как нарушение автоматического поворота взглядов.

Смежные вопросы