iPad / iOS7: controller de vista modal 'Página' comportamiento extraño después de presentar el controller de vista 'Pantalla completa' desde él

Mi aplicación iPad abre el controller de vista modal con el estilo de presentación 'Página'. Como usted sabe, el estilo de presentación "Página" no cubre la barra de estado de presentar el controller de vista para indicar la presentación de la página.

Controlador de vista inicial

Controlador de vista modal de página

Desde el controller de vista modal, la aplicación abre UIImagePickerController para hacer fotos. UIImagePickerController tiene estilo de presentación 'Pantalla completa'. Después de descartar el selector de imágenes que presenta el controller de vista modal, se convierte en 20px más alto y se solapa con la barra de estado del controller de vista inicial.

Intenté replace UIImagePickerController con UIImagePickerController simple y también rompe mi controller de vista modal.

Hay capturas de pantalla: Controlador de vista de pantalla completa

Controlador de vista modal roto

Solo la manera de restaurar el tamaño del controller de vista 'Página' está cambiando la altura del marco viewController.view.superview.superview.superview.superview después de volver al controller de vista 'Página'. Pero es muy extraño.

¿Hay otra forma de arreglar la presentación del controller de vista modal 'Página' después de descartar el controller de vista modal anidada?

ACTUALIZACIÓN: utilicé un código extraño para resolver mi problema:

 #define STATUS_BAR_HEIGHT 20 #define IPAD_PORTRAIT_HEIGHT 1004 #define IPAD_LANDSCAPE_HEIGHT 748 UIView *superview = nil; // In case of this view controller included in navigationController we have to use superview of navigation's controller view if (self.navigationController) superview = self.navigationController.view.superview; else superview = self.view.superview; CGRect r = superview.frame; // Sometimes we have to fix height + origin, sometimes only height (becase view has bottom magnifying) // In landscape orientation we have to fix 'width' instead of 'height', because that view controller always works in 'portrait' mode if (self.interfaceOrientation == UIInterfaceOrientationPortrait && r.size.height > IPAD_PORTRAIT_HEIGHT) { r.origin.y = STATUS_BAR_HEIGHT; r.size.height = IPAD_PORTRAIT_HEIGHT; } else if (self.interfaceOrientation == UIInterfaceOrientationMaskPortraitUpsideDown && r.size.height > IPAD_PORTRAIT_HEIGHT) { r.size.height = IPAD_PORTRAIT_HEIGHT; } else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft && r.size.width > IPAD_LANDSCAPE_HEIGHT) { r.size.width = IPAD_LANDSCAPE_HEIGHT; r.origin.x = STATUS_BAR_HEIGHT; } else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight && r.size.width > IPAD_LANDSCAPE_HEIGHT) { r.size.width = IPAD_LANDSCAPE_HEIGHT; } superview.frame = r; 

No creo que no haya una solución más elegante. ¿Alguna idea de cómo mejorarlo?

ACTUALIZACIÓN2: Acabo de abrir un error. Puedes seguirlo allí: rdar: // 15949644

ACTUALIZACIÓN3: Existe mi proyecto de muestra: enlace

No hay una buena solución, es un error de Apple, y hasta que se solucione, debes evitarlo. No se ha solucionado en iOS 7.1. Trabajé en una solución a esto y me di count de que también estaba implementando la misma solución. Es feo, pero funciona.

Una palabra en este layout. Mi suposition de por qué Apple pasó por alto este problema es porque presentar un controller de vista en pantalla completa no es algo que haría Apple. Esta no es una excusa, por supuesto, y a veces no hay otra opción que presentar una pantalla completa (tuvimos que abrir una vista de camera, que debe abrirse en pantalla completa, por ejemplo). Tal vez pueda cambiar su layout para adaptarse a los errores de Apple.

"Asegúrese de que el ViewController que está presentando la vista modal está en un NavigationController y esta rareza debe detenerse". Mi respuesta inicial – incorrecta

Actualizada Esto realmente suena como un error, aunque desde el punto de vista de la experiencia del usuario, uno realmente no debería acertar. Parece un poco mal presentar un controller de vista que está en el estilo de presentación 'Página' y luego presentar otro sobre él en modo de pantalla completa.

IMO que es un mal layout desde el principio, por lo que el hecho de que no actúe como cabría esperar probablemente se deba a que quien lo instaló no anticipó que alguien lo usara así.

Lo haría, más o less como mi respuesta inicial, aunque brevemente, incruste su controller de vista presentado de manera modal en un controller de navigation y empuje el UIImagPickerViewController a eso o agregue su vista animada a la suya como si aparentemente se presentara como otra página de estilo modal ver. Si eso es lo que quieres afectar.

Nada de eso suena perfecto, una solución más perfecta sería mirar el flujo de su aplicación y quizás reevaluar cómo se presentan las cosas.

Creo que es un problema de iOS7 donde los layouts de Vistas se han modificado ligeramente. Tuve un problema similar con una vista personalizada modal pop en la que noté el mismo comportamiento. Solucioné añadiendo esta línea en la vista de viewDidLoad

 self.edgesForExtendedLayout = UIRectEdgeNone; 

Tal vez podría ser útil para algún indicio de su problema.

Definitivamente hay un problema con UIImagePicker (o más ampliamente, UINavigationController) no obedece ninguna configuration de barra de estado en la aplicación.

Esto se ha discutido y resuelto volviendo a aplicar la configuration de la barra de estado en el delegado UINavigationController (ver UIImagePickerController rompe la apariencia de la barra de estado ).

En su caso, puede llamar self.edgesForExtendedLayout = UIRectEdgeNone; o intente reescribir algunas properties de la barra de estado en la callback delegada

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; 

Parece que es un error de iOS y, por ahora, se puede resolver con esa solución (es un método de controller de vista modal de 'Página')

 #define STATUS_BAR_HEIGHT 20 #define IPAD_PORTRAIT_HEIGHT 1004 #define IPAD_LANDSCAPE_HEIGHT 748 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear: animated]; // In case of iOS7 we need this weird code, because after displaying full screen view controller from 'Page' modal view controller our 'Page' controller // incorrectly shifts 20px up // // I haven't found best solution for now // There is my question on SO: http://stackoverflow.com/questions/21146801/ipad-ios7-page-modal-view-controller-strange-behaviour-after-presenting-full if (!isIOS6()) { [self setNeedsStatusBarAppearanceUpdate]; UIView *superview = nil; // In case of this view controller included in navigationController we have to use superview of navigation's controller view if (self.navigationController) superview = self.navigationController.view.superview; else superview = self.view.superview; CGRect r = superview.frame; // Sometimes we have to fix height + origin, sometimes only height (becase view has bottom magnifying) // In landscape orientation we have to fix 'width' instead of 'height', because that view controller always works in 'portrait' mode if (self.interfaceOrientation == UIInterfaceOrientationPortrait && r.size.height > IPAD_PORTRAIT_HEIGHT) { r.origin.y = STATUS_BAR_HEIGHT; r.size.height = IPAD_PORTRAIT_HEIGHT; } else if (self.interfaceOrientation == UIInterfaceOrientationMaskPortraitUpsideDown && r.size.height > IPAD_PORTRAIT_HEIGHT) { r.size.height = IPAD_PORTRAIT_HEIGHT; } else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft && r.size.width > IPAD_LANDSCAPE_HEIGHT) { r.size.width = IPAD_LANDSCAPE_HEIGHT; r.origin.x = STATUS_BAR_HEIGHT; } else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight && r.size.width > IPAD_LANDSCAPE_HEIGHT) { r.size.width = IPAD_LANDSCAPE_HEIGHT; } superview.frame = r; } }