iOS8: evita la rotación al presentar viewController
uitableview rotation (3)
Así que después de largos días de búsqueda e investigación, finalmente se me ocurrió una posible solución.
Antes que nada, puedo usar el controlador de navegación y presionar el control de vista en lugar de presentarlo, pero rompe mi código y no es tan cierto.
Lo segundo que puedo hacer es no establecer restricciones. Todavía puedo usar el autolayout, pero si no establezco restricciones y dejo que se establezcan las restricciones predeterminadas, tableView no se vuelve a cargar. por supuesto, esto tampoco es algo muy inteligente, ya que tengo muchos elementos en mi viewController.
Finalmente, descubrí que puedo mostrar este viewController "modal" en otra UIWindow. Creo UIWindow y establezco modalViewController como su rootViewController.
Puse un ejemplo de proyecto en git: https://github.com/OrenRosen/ModalInWindow
Espero que sea de ayuda.
Tenemos un MainViewController con un tableView, y presenta un nuevo modalViewController.
MainViewController está restringido a solo retrato, y modalViewController puede rotar.
El problema está en iOS8, que cuando el control modalViewController gira, el método de rotación de devolución de llamada en iOS8 en MainViewcontroller se llama - - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
Por lo tanto, UITableView está volviendo a cargar sus datos, que es un comportamiento que no queremos.
¿Podemos evitar esta característica de iOS 8 y no rotar la presentación de UIViewController?
En iOS 8, la vista que gira cuando cambia la orientación del dispositivo es la primera vista agregada a la UIWindow
. Por lo tanto, si guarda una referencia a él en shouldAutorotate
presentedController
, puede sobreescribir los valores de shouldAutorotate
y supportedInterfaceOrientations
.
Hice algo similar con un controlador de navegación, que no giraría a menos que el controlador empujado superior gire.
En su caso, verifique si el controlador principal presenta otro controlador. Si no es así, simplemente rechace la rotación; de lo contrario, devuelva lo que devuelve el controlador presentado para el método de rotación.
En cuanto a su vista de tabla, no debería volver a cargarse debido a las rotaciones.