2010-01-25 10 views
19

Sto cercando di dissolvenza in un UIView come sottoview della mia vista principale. L'UIView che sto cercando di sfumare ha le dimensioni di 320x55.Tentativo di dissolvenza in un UIView senza esito positivo

I ha installato la vista e un timer;

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]; 

Il timer attiva il seguente codice;

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"]; 

mio secondView è collegato in Interface Builder e risponde ad altri messaggi, ma non riesco a vedere nulla accade sullo schermo.

Qualcuno può aiutarmi a capire cosa sta succedendo qui?

Grazie, Ricky.


In risposta ad una seguente raccomandazione:

Sono un po 'incerto qui. Inizialmente ho messo questo codice in (perché vedo secondView come un esempio di UIView?):

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

Allora ho provato il tuo suggerimento, che non producono avvisi o errori, ma ancora non porta niente alla superficie:

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

Grazie! Ricky.


risposta

43

Si dovrebbe essere in grado di fare questo un po 'più semplice. Hai provato qualcosa del genere?

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

Questo codice produce 3 avvisi, tutti dicendo che UIView potrebbe non rispondere ai messaggi. Arresta anche l'app. Perchè è questo? – Ricky

+0

@Ricky: è strano. Stai usando l'iPhone SDK? – kennytm

+0

Puoi pubblicare il codice circostante? Compila bene quando lo faccio. – kubi

11

questo non rispondere alla tua domanda, se ti ostini a usare CoreAnimations, ma per iPhoneOS è molto più facile da usare blocchi di animazione per le animazioni UIView.

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

Inoltre, è possibile richiamare un delegato in tempo differito con

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

È possibile eliminare completamente il timer chiamando anche UIView setAnimationDelay. per esempio. [UIView setAnimationDelay: 0.5] –

16

mi sembra che una cosa che ti manca è che la tua vista potrebbe avere già un alfa di 1.0. assicurati che l'alfa sia 0 (o qualsiasi altra cosa desideri che sia) prima della chiamata dell'animazione.

preferisco usare le animazioni di blocco per questo. è più pulito e più autonomo.

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

Per essere specifico sul thread di animazione, è il thread principale. Le modifiche dell'animazione vengono inviate nell'intervallo di tempo (durata dell'animazione). E una nota a margine, ricorda sempre di chiamare i metodi "UIView animateWithDur ..." dal thread principale. Pertanto, se questa chiamata proviene da un thread diverso da main, avvolgilo con dispatch_asynch (dispatch_get_main_queue(),^{[UIView animateWithDur ...]}); –

+0

+1 per 'la tua vista potrebbe già avere un alfa di 1.0'. In tal caso, "animando" da 1.0 a 1.0, l'animazione termina immediatamente e non dopo la durata specificata. Assicurati che ci sia effettivamente una modifica da animare. – pkamb

+0

@ GökhanBarışAker corretto sul punto di threading. la maggior parte dei miei blocchi sono sul loro stesso filo e ho parlato troppo presto. ho aggiornato il post. Grazie per la segnalazione. – steveb

8

Ecco anche una buona alternativa con molte opzioni e facile da usare.

[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 
     }]; 
Problemi correlati