ios window touch orientation ios8

La posición táctil de iOS8 está limitada en Paisaje, como si la ventana es Retrato en un lado?



window touch (6)

Estoy teniendo un problema extraño aquí con iOS8. He estado buscando en Google y golpeando mi cabeza contra la pared por un par de días sin suerte. No estoy exactamente seguro de cómo explicarlo, pero aquí va ...

Las aplicaciones han estado funcionando bien en iOS7, pero ahora compilando usando xCode 6 / iOS8 estoy teniendo algunos problemas de orientación extraños. No estoy usando un archivo xib, sino que creo una ventana y lo veo de forma programática. Estoy ejecutando OpenGL en la vista y luego manejo todo lo demás dentro de OpenGL. Por lo tanto, estoy recopilando toques y pasándolos a mis rutinas GL. Todo ha estado bien para siempre, hasta ahora.

Ahora con iOS8 parece que la "ventana táctil" está girando para que los toques en Paisaje estén limitados a un lado de la pantalla, como si la ventana de visualización fuera Horizontal, pero los toques están todos dentro de una ventana Vertical que está configurada para en un lado de la pantalla.

Lo que parece extraño es que los toques llegan a la vista en toda la pantalla de forma normal, pero el valor Y se detiene en 320 y no va más allá. La X actúa normalmente. Si cambio el dispositivo a Vertical (el controlador de vista no gira automáticamente), todo funciona, pero en Paisaje cambia a este comportamiento extraño.

Intenté todo lo que pude pensar sin ningún cambio, y no estoy seguro de por dónde empezar a pensar por qué podría estar pasando esto. Cualquier consejo sería muy apreciado.


Supongo que cualquier vista que posea el reconocedor de gestos no se redimensiona durante la rotación por uno (o más) de los siguientes motivos:

  • Utiliza el diseño automático y no está fijado a su supervista
  • Utiliza muelles y puntales y no tiene la máscara UIViewAutoresizing correcta
  • Vive en una subvista que no está siendo redimensionada

Si está utilizando el diseño automático, intente esto en su controlador de vista:

- (void)viewDidLayoutSubviews { // For each subview with its own auto layout: [self.mySubview layoutSubviews]; // ... [super viewDidLayoutSubviews]; }


Bien, he encontrado el problema de mi parte (soy el dador de recompensas).

Probablemente estábamos usando algún tipo de truco en nuestra aplicación para manejar manualmente la rotación de nuestras vistas, ya que estábamos devolviendo 0 a la - (NSUInteger)supportedInterfaceOrientations en nuestro rootViewController .

- (NSUInteger)supportedInterfaceOrientations { return 0; // BOOOOOOO, even forbidden by documentation }

A continuación, gestionamos manualmente nuestras vistas internas escuchando la notificación UIDeviceRotationChanged, rotándolas y solicitando también que la barra de estado gire.

Al devolver algo que no sea 0 a este supportedInterfaceOrientations la capa "táctil" gira junto con el resto.
Pero ahora tenemos que hacer que el código evolucione para usar la rotación de iOS en lugar de nuestra capa hacky.

Además, después de investigar más, especialmente en iPad, debe usar una ventana UI basada en guiones gráficos. Usar una ventana basada en XIB dará como resultado que sus dimensiones sean incorrectas cuando la aplicación se inicie mientras está en el modo paisaje. Esto lleva a una montaña de marcos con errores y se ensucia mal con nuestro diseño.


En nuestro caso.
La fuerza para rotar con la transformación de la vista causó ese problema.
Eliminamos ese código, rotamos con

+ (void)attemptRotationToDeviceOrientation

y problema resuelto

Llamamos a ese método en nuestro método forceRotate.

-(void)forceRotateLandscape { ... UIViewController *vc = [UIViewController new]; [topVc presentViewController:vc animated:NO completion:nil]; [topVc dismissViewControllerAnimated:NO completion:nil]; supportedOrientations = UIInterfaceOrientationMaskLandscapeRight; [UIViewController attemptRotationToDeviceOrientation]; ... }


En iOS8, UIScreen ahora está orientado a la interfaz. En algunas (o debería decir todas) las bibliotecas antes de iOS8, se realizaron algunos controles para ajustar esa falta y cambiar el ancho y el alto cuando la aplicación estaba en el paisaje.

Debería ver algún código que hace un poco de rotación y eliminarlo.

-[UIScreen bounds] ,
-[UIScreen applicationFrame] ,
Marco de la barra de estado y
El marco del teclado ahora está orientado a la interfaz.
(consulte el video WWDC2014 - vea los avances del controlador en iOS8 @ 50:41)


Yo tuve el mismo problema. En iOS7 todo funcionó bien, en iOS8 era como si la "vista táctil" todavía estuviera en retrato.

Acabo de reemplazar el xib principal con un guión gráfico, no hay otro cambio (he intentado jugar mucho con la pantalla encuadernada y el marco sin ningún resultado).

Solo pruébalo, avísame si también funciona para ti. Buena suerte.


Tengo el mismo problema con la segunda ventana en el paisaje. Se niega a mostrarse en la pantalla completa y también a recibir eventos táctiles en la parte cortada de la pantalla. La única solución que encontré hasta ahora es permitir el soporte de las resoluciones nativas de iPhone6 ​​/ 6 + al agregar pantallas de inicio requeridas. Si no admite estas resoluciones en su aplicación, podría ser el mismo problema.