¿Por qué veo una animación desigual cuando uso este bloque de animación UIView?

Tengo una barra de pestañas que se hace en la aplicación delegada. Al llamar a una acción desde el clic de un botón desde una de las vistas cargadas desde la barra de pestañas, abro la pantalla de ayuda pero hay un movimiento de sacudidas después de la carga.

perdóname por hablar informalmente ... he estado hurgando en mi cerebro durante las últimas horas tratando de resolver esto ...

-(void)flipToHelp {
 HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
 [self setHelpViewController:helpVariable];
 [UIView beginAnimations:@"flipview" context:nil]; 
 [UIView setAnimationDuration:0.5];
 [UIView setAnimationCurve:UIViewAnimationCurveLinear];
 [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
 forView:_window cache:YES];

[_window removeFromSuperview];
[helpVariable release];
self.window.rootViewController = self.HelpViewController;
[UIView commitAnimations];
}

preguntado el 16 de mayo de 11 a las 19:05

Por qué está llamando [_window removeFromSuperview]? ¿No debería eliminar el controlador de la barra de pestañas de la ventana? -

Intenté eso pero sigo recibiendo un error al usar "self.window = self.HelpViewController;" ... advertencia: Problema semántico: tipos de puntero incompatibles que se asignan a 'UIWindow *' desde 'HelpViewController *' -

No estoy seguro de si reasignar rootViewController cambia la vista. Si es así, todo lo que necesita hacer es eliminar el [_window removeFromSuperview] línea. Si cambiar rootViewController no es suficiente, puede hacer: [self.tabBarController removeFromSuperview]; [self.window addSubview:self.HelpViewController.view];. -

¡WOAH! quitando [_window removeFromSuperview]; y añadiendo [self.window addSubview:self.HelpViewController.view]; ¡Hizo el truco! No pude agregar [self.tabBarController removeFromSuperview]; Para traer de vuelta la pantalla principal hice esto [self.HelpViewController.view setHidden:1]; [self.HelpViewController.view removeFromSuperview]; self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible]; [UIView commitAnimations];} Parece estar funcionando, pero ¿es la forma correcta de hacerlo? ¡Muchas gracias Daniel! -

2 Respuestas

Solo para reiterar del hilo de comentarios, no debería eliminar la ventana de su supervista (técnicamente no tiene una supervista, por lo que probablemente esté causando problemas). Y poniendo la ventana rootViewController la propiedad debería cambiar las jerarquías de vista, Aparentemente, la sacudida proviene de cambiar la ventana rootViewController propiedad, por lo que tal vez la solución sea evitar el uso de esa propiedad. Esto es lo que creo que debería ser suficiente para lograr esto:

-(void)flipToHelp {
     HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
     [UIView beginAnimations:@"flipview" context:nil]; 
     [UIView setAnimationDuration:0.5];
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:_window cache:YES];
    [self.tabBarController removeFromSuperview];
    [_window addSubview:helpVariable];
    [UIView commitAnimations];
}

contestado el 17 de mayo de 11 a las 20:05

no tirones aquí -(void)flipToHelp { HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil]; [self setHelpViewController:helpVariable]; [UIView beginAnimations:@"flipview" context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_window cache:YES]; [helpVariable release]; [self.window addSubview:self.HelpViewController.view]; [UIView commitAnimations]; } - BlockReader

Tal vez las sacudidas sean un problema con la forma en que UIWindow actualiza las vistas cuando configura rootViewController. Tal vez su mejor opción sea no usar esa propiedad en absoluto; actualizaré la respuesta con su solución. - Daniel Dickison

-(void)flipToHelp {
  HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
  [self setHelpViewController:helpVariable];
  [helpVariable release];

  [UIView beginAnimations:@"flipview" context:nil]; 
  [UIView setAnimationDuration:0.5];
  [UIView setAnimationCurve:UIViewAnimationCurveLinear];
  [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
                         forView:self.window
                           cache:YES];

  self.window.rootViewController = self.HelpViewController;
  [UIView commitAnimations];
}

¿Qué tal este código? ¿Todavía tiene una animación entrecortada?

contestado el 17 de mayo de 11 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.