2010-01-25 11 views
19

Estoy intentando desvanecerme en una UIView como una subvista de mi vista principal. La UIView que intento desvanecerme tiene las dimensiones de 320x55.Intentando desvanecerse en una UIView sin éxito

Configuro la vista y un temporizador;

secondView.frame = CGRectMake(0, 361, 320, 55); 
secondView.alpha = 0.0; 
[self.view addSubview:secondView]; 
[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(fadeView) userInfo:NO repeats:NO]; 

El temporizador activa el siguiente código;

secondView.alpha = 1.0; 
CABasicAnimation *fadeInAnimation; 
fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.duration = 1.5; 
fadeInAnimation.fromValue = [NSNumber numberWithFloat:0.0]; 
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0]; 
[fadeInAnimation setDelegate:self]; 
[secondView.layer addAnimation:fadeInAnimation forKey:@"animateOpacity"]; 

Mi secondView está conectado en el Interface Builder y responde a otros mensajes, pero no puedo ver nada en la pantalla.

¿Alguien puede ayudarme a averiguar qué está pasando aquí?

Gracias, Ricky.


En respuesta a una recomendación siguiente:

estoy un poco inseguro aquí. Inicialmente pongo este código en (porque veo secondView como una instancia de UIView?):

[secondView beginAnimations:nil context:NULL]; 
[secondView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[secondView commitAnimations]; 

Entonces intenté su sugerencia que no produjo advertencias o errores, pero aún lo hace no aporta nada a la superficie:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 

¡Gracias! Ricky.


Respuesta

43

Usted debe ser capaz de hacer esto un poco más simple. ¿Has intentado algo como ésto?

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 
+0

Ese código produce 3 advertencias, todas diciendo que UIView puede no responder a los mensajes. También bloquea la aplicación. ¿Por qué es esto? – Ricky

+0

@Ricky: Eso es extraño. ¿Estás usando el iPhone SDK? – kennytm

+0

¿Se puede publicar el código que lo rodea? Compila muy bien cuando lo hago. – kubi

11

esto no va a responder a su pregunta si usted insiste en el uso de CoreAnimations, pero para iPhoneOS es mucho más fácil de usar bloques de animación para animaciones UIView.

secondView.alpha = 0.0f; 
[UIView beginAnimations:@"fadeInSecondView" context:NULL]; 
[UIView setAnimationDuration:1.5]; 
secondView.alpha = 1.0f; 
[UIView commitAnimations]; 

Además, puede invocar un delegado en el tiempo retardado con

[self performSelector:@selector(fadeView) withObject:nil afterDelay:0.5]; 
+2

Puede deshacerse del temporizador alltogether también llamando a UIView setAnimationDelay. p.ej. [UIView setAnimationDelay: 0.5] –

16

me parece que una cosa que te hace falta es que tu vista ya tiene un alfa de 1.0. asegúrate de que el alfa sea 0 (o lo que quieras que sea) antes de la llamada de animación.

prefiero usar animaciones de bloque para esto. es más limpio y más autónomo.

secondView.alpha = 0.0f; 
[UIView animateWithDuration:1.5 animations:^() { 
    secondView.alpha = 1.0f; 
}]; 
+1

Para ser específico sobre el hilo de la animación, es el hilo principal. Los cambios de animación enviados durante el intervalo de tiempo (duración de la animación). Y una nota al margen, siempre recuerde llamar a los métodos "UIView animateWithDur ..." del hilo principal. Por lo tanto, si esta llamada se realizó a partir de un hilo que no sea main, envuélvalo con dispatch_asynch (dispatch_get_main_queue(),^{[UIView animateWithDur ...]}); –

+0

+1 para 'su vista ya puede tener un alfa de 1.0'. En ese caso, "animando" de 1.0 a 1.0, la animación termina inmediatamente y no después de la duración especificada. Asegúrate de que haya realmente un cambio para animar. – pkamb

+0

@ GökhanBarışAker correctos en el punto de enhebrar. la mayoría de mis bloques están en su propio hilo y hablé demasiado pronto. He actualizado la publicación. gracias por señalar eso. – steveb

8

Aquí también hay una buena alternativa con muchas opciones y fácil de usar.

[secondViewController.view setAlpha:0.0]; 
    [UIView animateWithDuration:1.5 
      delay:0.0 
      options:UIViewAnimationOptionCurveEaseIn // See other options 
      animations:^{ 
      [secondViewController.view setAlpha:1.0]; 
     } 
     completion:^(BOOL finished) { 
     // Completion Block 
     }]; 
Cuestiones relacionadas