2011-04-24 11 views
5

Acabo de actualizar mi iPhone 4 de iOS 4.2.1 a 4.3.2, y a XCode 4.0.2, y encuentro algunos problemas extraños con las animaciones uiview. Cuando por primera vez lanzar mi aplicación, código como este se ejecuta a la perfección:Las animaciones UIView dejan de funcionar después de cerrar Modal View

 [UIView beginAnimations:@"fadeAlphaIn" context:nil]; 
    [UIView setAnimationDuration:0.5f]; 
    viewClue.alpha = 1.0f; 
    [UIView commitAnimations]; 

Pero entonces, después de despedir a una presentación y luego despedir a un punto de vista modal por el método estándar:

[self presentModalViewController:more animated:YES]; 

y

[self dismissModalViewControllerAnimated:YES]; 

la primera animación ya no funciona. En lugar de desvanecerse, por ejemplo, la vista viewClue simplemente salta de alfa = 0 a alpha = 1. De manera similar, otras animaciones que alteran la propiedad de marcos de otras vistas solo obligan al marco a saltar del valor inicial al final sin animación. Estas animaciones funcionaron bien antes de que se presentara y descartara la vista modal.

Entiendo que otros han tenido problemas de animación con la actualización a iOS 4.3.2, pero la forma en que la vista modal altera la animación parece muy extraña. ¿Alguien más ha experimentado este problema? ¿Alguna idea sobre una solución? Estoy pensando en simplemente agregar la vista modal como una subvista y animarla a medida que se oculta y aparece, pero usar el método de vista modal estándar sería mucho más preferido.

Gracias por su ayuda,

James

EDIT: algo más de código que muestra cómo el mapa de la aplicación está animado

-(void) viewMapfunc 
{ 
    AudioServicesPlaySystemSound(soundID); 
    if(mapvisible){ 
     [UIView animateWithDuration:0.5 
           delay:0.1 
          options:UIViewAnimationOptionAllowUserInteraction 
         animations:^{ 
          map.frame = CGRectMake(0, 350, 320, 27); 
          mapscroll.frame = CGRectMake(0, 27, 320, 0); 
         } 
         completion:nil]; 

     mapvisible = NO; 
     viewMapLabel.text = @"View Map"; 
    }else { 
     [UIView animateWithDuration:0.5 
           delay:0.1 
          options:UIViewAnimationOptionAllowUserInteraction 
         animations:^{ 
          map.frame = CGRectMake(0, 50, 320, 300); 
          mapscroll.frame = CGRectMake(0, 27, 320, 300); 
         } 
         completion:nil]; 
     mapvisible = YES; 
     viewMapLabel.text = @"Hide Map"; 
    } 
} 
+0

Asegúrese de que tiene este problema en el dispositivo w/o un depurador asociado. Me di cuenta de donde se encuentra ahora el comportamiento extraño animaciones durante la depuración en el simulador –

Respuesta

0

Al final, eliminé todas las vistas modales y las implementé de otras maneras. Por alguna razón, el uso de vistas moda desordenó las animaciones. No tiene sentido, pero eliminarlos solucionó el problema. Si alguien me puede aclarar por qué sucede esto, podría ser bueno para problemas de memoria ...

+6

¿Alguien ha descubierto por qué sucede esto? –

2

intenta comprobar dos cosas:

  • Do comprometes todas las animaciones iniciadas? Obtuve todo tipo de efectos extraños después de no haber cometido ninguno de ellos.
  • ¿Alguna animación tiene lugar al mismo tiempo? Especialmente con la misma vista.
  • Si las animaciones tienen lugar justo después de cambiar las propiedades. Algo así como:

-

view.alpha = 1; 
[UIView beginAnimations:…]; 
view.alpha = 0; 
[UIView commitAnimations:…]; 

En este ejemplo, la vista no cambiará su valor alfa de 1 a 0. Se va a cambiar al instante. Para iniciar una animación, debe extraer el bloque de animaciones a otro método y llamarlo con performSelectorInMainThread: withObject: afterDelay :. El retardo puede ser incluso 0.

+0

gracias por la respuesta Alexander. todas las animaciones están comprometidas, y ninguna tiene lugar simultáneamente. Jugué moviendo el código para bloquear la animación base, pero sin gran efecto. Me pregunto si de alguna manera me perdí algo relacionado con el cierre de la animación de transición de vista modal. Lo investigaré a continuación. – James

+0

respuesta actualizada con tercera opción – bealex

+0

tercer punto interesante. Voy a intentarlo e informaré. – James

0

Tuve el mismo problema. La raíz de mi problema fue que mi animación estaba siendo activada por una notificación, y estaba agregando un observador en cada viewWillAppear, pero olvidé eliminarla en viewDidDisappear (recuerde que iOS 6 ya no llama a viewDidUnload confiablemente).

Esencialmente, estaba llamando a mi función de animación dos veces en rápida sucesión, que estaba causando la irregularidad visible.¡Espero que esto ayude a alguien en el futuro!

0

He conseguido resolver este mismo problema en mi propia aplicación.

me di cuenta de que durante la depuración mis UIImageViews que fui animando tenían diferentes direcciones de memoria antes y después de que me empujó a mi controlador de vista modal (s). En ningún otro momento estos UIImageViews cambiaron sus direcciones de memoria.

pensé que esto podría haber sido la raíz del problema y parece que tenía razón.

El código de mi cliente había estado asignando/inicializando el UIImageViews de mi View Controller en -viewDidAppear en lugar de en -viewDidLoad. Por lo tanto, cada vez que iniciaba y descartaba un controlador de vista modal mi UIImageViews que estaba animando se reiniciaría.

Compruebe usted mismo si la dirección de memoria de su objeto de mapa está cambiando antes y después de iniciar sus modales, y si es seguro, mueva su lógica de inicialización a una sección más adecuada de su código.

Espero que esto te ayude!

Dexter

0

que estaba usando UIView animateWithDuration: y yo lo resolvió por no usar el bloque de terminación. Este es el código de una UIView subclasificada. En viewWillAppear del controlador de vista: He definido self.shouldAnimate a YES, y en viewWillDisappear del controlador de vista: He definido self.shouldAnimate a NO.

-(void)continueRotate { 
    if (self.shouldAnimate) { 
    [self rotateRadarView:self.radarInner]; 
    } 
} 

-(void)rotateRadarView:(UIView *)view { 
    [UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(continueRotate)]; 
    [view setTransform:CGAffineTransformRotate(view.transform, M_PI_2)]; 
    }completion:nil]; 
} 
0

Lo resuelto reiniciando mi animación en mi subclase UIView:

override func willMove(toWindow newWindow: UIWindow?) { 
    if newWindow != nil { 
     spinner.startSpinning() // Restart any animation here 
    } 
} 
Cuestiones relacionadas