¿Por qué el marco primario no se mantiene del mismo tamaño después de descartarViewControllerAnimated?

He descargado el código de ejemplo de PageControl de apple. Es un proyecto con un UIPageControl . Lo he cambiado para que UIScrollView tenga vistas diferentes. Para cada vista que quiero agregar, creé un UINavigationController con un rootViewController como una subclass de UIViewController o UITableViewController . Luego agregué a UIScrollView , la vista del navigationController .

Digamos que estoy en la primera vista, ahora. Quiero mostrar un controller de vista modal. Cuando lo rechazo, el controller de vista principal ( HomeViewController en mi ejemplo) está en pantalla completa, en lugar del tamaño que tenía antes, que mostraría el control de página en la parte inferior. La única forma en que puedo hacer que funcione correctamente es cambiar el tamaño del marco después de descartar, pero esa es una mala experiencia de usuario, ya que se llama después de que se muestre el controller de vista principal. ¿Alguna idea sobre cómo evitar que se networkingimensione el marco HomeViewController al descartar un controller de vista modal?

 -(void)dismissMVC:(id)sender { CGRect frame = self.view.frame; [self dismissViewControllerAnimated:YES completion:^{ self.view.frame = frame; }]; } - (void)loadScrollViewWithPage:(int)page { if (page < 0) return; if (page >= kNumberOfPages) return; // replace the placeholder if necessary switch (page) { case Home: { HomeViewController *controller = [viewControllers objectAtIndex:page]; if ((NSNull *)controller == [NSNull null]) { controller = [[HomeViewController alloc] initWithPageNumber:page]; [viewControllers replaceObjectAtIndex:page withObject:controller]; [controller release]; } // add the controller's view to the scroll view if (controller.view.superview == nil) { UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; navController.navigationBar.barStyle = UIBarStyleBlack; [navController setNavigationBarHidden:YES]; CGRect frame = scrollView.frame; frame.origin.x = frame.size.width * page; frame.origin.y = 20; frame.size.height = frame.size.height - 20; navController.view.frame = frame; controller.view.frame = frame; [controller setNavController:navController]; [scrollView addSubview:navController.view]; [navController release]; } break; } } } 

Al empujar veiwControllers a una stack de navigation, viewControllers cuya vista no es la actual que se muestra puede liberarse debido a la poca memory.

Si mantiene una instancia del HomeViewController en el file appdelegate o dentro de la instancia de viewcontroller que presionó originalmente, podría llamar a HomeViewController.view para forzar que la vista se cargue y luego darle el marco deseado antes de llamar a dismissViewControllerAnimated.

Al agregar la vista de un viewcontroller como una subvista, también debe agregarlo como un childViewController.

En tu código:

[scrollView addSubview: navController.view];

Falta la línea: [scrollView addChildViewController: navController];