2012-07-03 8 views
5

He descargado el código de muestra de PageControl de Apple. Es un proyecto con un UIPageControl. Lo he cambiado para que el UIScrollView tenga diferentes vistas. Para cada vista que deseo agregar, creé un UINavigationController con un rootViewController como una subclase de UIViewController o UITableViewController. Luego agregué en el UIScrollView, la vista del navigationController.¿Por qué el marco principal no se mantiene del mismo tamaño después de cerrar ViewControllerAnimated?

Digamos que estoy en la primera vista, ahora. Quiero mostrar un controlador de vista modal. Cuando lo descarto, el controlador 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 manera en que puedo hacer que funcione correctamente es redimensionando el marco después del descarte, pero esa es una mala experiencia de usuario, porque se invoca después de que se muestra el controlador de vista principal. ¿Alguna idea sobre cómo evitar el tamaño del marco HomeViewController cuando se descarta un controlador 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; 
    } 
} 
} 
+0

¿alguna vez descubrió por qué esto es cierto? – aloo

+0

@aloo Ha pasado casi un año, así que no recuerdo cómo solucioné esto. ¿Estás teniendo el mismo problema? – Adriana

+0

sí experimentándolo pero no puedo reproducirlo en un pequeño proyecto de prueba – aloo

Respuesta

2

Al empujar veiwControllers en una pila de navegación, viewControllers que es vista no son el actual que se muestra puede ser liberado debido a baja memoria.

Si mantiene una instancia de HomeViewController ya sea en el appdelegate o dentro de la instancia del viewcontroller que presionó originalmente, puede llamar a HomeViewController.view para forzar su vista y cargar el marco deseado antes de llamar dismissViewControllerAnimated.

0

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

En su código:

[ScrollView addSubview: navController.view];

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

Cuestiones relacionadas