Error de orientación del keyboard iOS 8.3

Me enfrento a una extraña cuestión de iOS 8.3 que muestra un keyboard con una orientación incorrecta como esta (el controller de visualización está en modo Horizontal, pero el keyboard aparece en modo vertical):

el controlador de vista está en modo Horizontal, pero el teclado aparece en modo vertical

Puedo desencadenar este problema siguiendo estos pasos:

  1. Cree 2 UIViewController : ViewControllerA y ViewControllerB

  2. en ViewControllerA implementa UIInterfaceOrientationMaskPortrait y devuelve UIInterfaceOrientationMaskPortrait

  3. en ViewControllerB implementar UIInterfaceOrientationMaskLandscape y devolver UIInterfaceOrientationMaskLandscape

  4. Cree una subclass UINavigationController llamada NavigationController , aplique [self.topViewController supportedInterfaceOrientations] y devuelva [self.topViewController supportedInterfaceOrientations] (estoy haciendo esto porque quiero mantener el NavigationController y su rootVC no se puede girar)

  5. Utiliza el control de NavigationController como controller de vista inicial de la aplicación, establece ViewControllerA como rootViewContrller

  6. Inicie la aplicación, ViewControllerA aparecerá en Portrait. Mostrar un button en ViewControllerA , presionar el button presentará ViewControllerB usando presentViewController:animated:completion

  7. ViewControllerB aparecerá en Landscape; Mostrar un campo de text en ViewControllerB , tocar el campo de text activará el keyboard, pero el keyboard está en modo de retrato, al igual que la image de arriba.

PD. Puede download y ejecutar el proyecto Xcode en github

Este problema parece solo aparece en iOS 8.3. Estoy haciendo algo mal ? O tal vez esto es solo otro error de iOS?

Por cierto, este problema no sucederá si simplemente muestra ViewControllerA directamente sin ViewController . Entonces, si esto es un error de iOS, ¿cómo puedo evitar subclass UINavigationController pero todavía mantener ViewControllerA que es rootViewController de un UINavigationController de rotar.


ACTUALIZACIÓN: Este error aún aparece en iOS 8.4, disparé un informe de errores y obtuve respuestas de Apple el 17 de junio de 2015, dijeron que se trató en el último iOS 9 beta.

Conseguimos solucionar este problema engañando al dispositivo para que pensara que se había girado en una orientación diferente y luego en su orientación deseada.

 - (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"]; } } 

Le pregunté a un soporte técnico y me dijeron

Nuestros ingenieros han revisado su request y han determinado que esto se manejará mejor como un informe de errores.

Parece que se ha confirmado un error del sistema.

Y mi solución actual es agregar un ViewControllerC (compatible con el modo horizontal y vertical) entre ViewControllerA y ViewControllerB: ViewControllerA debería presentar ViewControllerC con animation, después de que ViewControllerC apareciera, presentar ViewControllerB sin animation.

Para que la transición se vea natural, puede establecer el mismo color de background que ViewControllerB en ViewControllerC, o tomar una captura de pantalla de ViewControllerB y agregarlo a ViewControllerC como image de background.

No es una solución perfecta, para los usuarios, pueden descubrir que ViewControllerB tarda más en cargarse.

Pude hacer que el keyboard aparezca correctamente usando lo siguiente.

 - (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"]; } } 

Tenga en count que el uso de UIDeviceOrientationUnknown no causa efectos secundarios, como la rotation automática inadecuada de las vistas.