Optimización para el nuevo iPad Pro Simulator

He instalado el último Xcode 7.1 beta e bash ejecutar mi proyecto en el iPad Pro Simulator. Todo está bien y todas las funciones funcionan correctamente.

Pero tengo un problema con el tamaño de la pantalla …

En la pantalla principal de la aplicación, ejecuto el siguiente logging:

NSLog(@"%f", self.view.bounds.size.width); 

Tengo 1024 para orientación horizontal. Pero cuando creo una nueva aplicación en Xcode 7.1 y ejecuto el mismo código en la pantalla principal obtengo otro valor: 1366.

Hoy planeo encontrar diferencias entre los files de proyecto creados en Xcode antiguo (6.4) y la beta 7.1 más reciente usando Araxis Merge.

¿Ahora cómo solucionar este problema para mi antiguo proyecto?

Puede que esté lejos, pero estaba teniendo un problema similar con el simulador iPad Pro: siguió dándome la resolución estándar de 1024 * 768 puntos. Después de un poco de excavación, me di count de que estaba usando la image estándar de lanzamiento del iPad (ya que no hay una versión de iPad Pro en el catálogo de activos), lo que restringió mi pantalla para que permanezca 1024 * 768 puntos. Una vez que presenté un storyboard de lanzamiento, todo quedó en su lugar, y mi aplicación se lanzó con el tamaño correcto de 1366 * 1024 puntos.

TL; DR: Parece que la jerarquía de vista no está ajustada para el tamaño de pantalla de iPad Pro hasta que se viewWillLayoutSubviews: y viewDidLayoutSubviews: Cuando el sistema de disposition invoca esto depende de la construcción de su jerarquía de vista.


Al actualizar mi aplicación para iPad Pro también estoy viendo un comportamiento similar. Por lo tanto, eché un vistazo más profundo a los events del ciclo de vida del controller de visión para ver qué sucedía tanto en mi proyecto actual como en un nuevo proyecto.

Para un proyecto nuevo, utilizando un controller de vista que solo tiene una barra de navigation (colocada justo debajo de la barra de estado) y una vista principal (que ocupa el rest del espacio, con el layout automático activado, en el modo horizontal a la la siguiente captura de pantalla:

Controlador de vista de muestra con barra de navegación y diseño automático

Estoy viendo la siguiente salida de la console para el ciclo de vida del controller de vista:

 -[ViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[ViewController viewDidLoad] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} -[ViewController viewWillAppear:] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[ViewController viewWillAppear:] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} -[ViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[ViewController viewWillLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} -[ViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[ViewController viewDidLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}} -[ViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[ViewController viewDidAppear:] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}} 

Por lo que veo aquí, la vista comienza con un ancho de 1024 puntos, pero una vez que se ejecuta 'viewDidLayoutSubviews', se ha determinado el tamaño apropiado (1366 puntos).

En mi propio proyecto para una pantalla que está utilizando un controller de vista dividida, puedo ver un comportamiento similar:

 -[XYZViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillAppear:] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

En este caso, dado que la jerarquía de vista es diferente, viewWillLayoutSubviews: se llama antes en el ciclo de vida del controller de vista y el tamaño correcto ya ha sido determinado por la vista viewWillAppear: se invoca. Pero como puede ver, esto realmente depende de su jerarquía de vista, por lo que le recomiendo que confirme su jerarquía de vista y luego determine la mejor location para agregar su código dependiente de la resolución.

Si codificas duro el marco de cualquier elemento de la interfaz de usuario debido a algunas razones, es posible que tengas que cambiarlo para el próximo iPad pro. Porque, tiene un tamaño de pantalla diferente (en puntos) por completo.

Si usa el layout automático y los frameworks dynamics (por ejemplo, self.view.bounds.size.width), debería funcionar bien, supongo.