/ / Vuoi uno sfarfallio UIImageView (CoreAnimation e alpha-value) - iphone, objective-c, core-animation

Vuoi uno sfarfallio di UIImageView (CoreAnimation e alpha-value) - iphone, objective-c, core-animation

Mi piacerebbe avere un UIImageView che sfarfalla. Mi sa che posso farlo con CoreAnimation e il valore alfa. Ho provato questo:

for (int a = 1; a <= 100; a++) {
schwarz.alpha = 0.7;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 0,1;
[UIView commitAnimations];
}

ma non funziona. Passa semplicemente a 0,1 e non ancora a 0,7. Ho anche provato questo:

schwarz.alpha = 0.7;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 0.1;
[UIView commitAnimations];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 1;
[UIView commitAnimations];
[UIView commitAnimations];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 3;
[UIView commitAnimations];
// and so on...

E ancora non funziona. Come posso implementare lo sfarfallio? Grazie!

risposte:

2 per risposta № 1

Il problema con il tuo codice è che [UIViewcommitAnimation] doesn "t block - intendo che l'implementazione del codice continua e l'animazione viene eseguita in modo asincrono. Quindi, in realtà, quello che sta succedendo è che tu fai prima tutte le iterazioni del ciclo e poi l'animazione è fatta da 0.7 a 1.0 ...

Basta usare setAnimationDidStopSelector senza il ciclo "for".

schwarz.alpha = 0.7;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
schwarz.alpha = 0.1;
[UIView commitAnimations];

Il metodo di cattura potrebbe essere:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
/* Do your things here... */ }

1 per risposta № 2

Tutte le animazioni di UIView aggiunte in un ciclo di eventi sono sostanzialmente unite. È necessario utilizzare l'animazione UIViewDidStopSelector. Ad esempio, vedere quanto segue:

-(void)tileAnimate:(NSString*)animationID finished:(BOOL)finished context:(void*)context  {
int position = [animationID intValue];
NSString *next = [NSString stringWithFormat:@"%d", position+1];
if(position == boardSize) {
return;
}
[UIView beginAnimations:next context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:timing];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(tileAnimate:finished:context:)];
buttons[position].transform = CGAffineTransformIdentity;
[UIView commitAnimations];
}

Uso questo, uno dopo l'altro, animando il restringimento di una serie di pulsanti alle dimensioni normali.


1 per risposta № 3

Altre due cose:

Primo, UIViewAnimationCurveEaseIn non funziona dissolvenza penso.

Secondo, nel tuo codice originale dici:

schwarz.alpha = 0,1;

Nota che c'è una virgola lì e non un punto. È interessante notare che il codice viene compilato, ma probabilmente non fa ciò che intendevi.


1 per risposta № 4

Ecco un'altra opinione su questo. Non sto usando lo sbiadimento, ma penso che l'effetto di sfarfallio sia ancora bello.

http://github.com/st3fan/iphone-experiments/tree/master/Miscellaneous/Flicker/


0 per risposta № 5

Usa il primo esempio di codice pubblicato, ma estrai il for dichiarazione e aggiungere le linee

[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationRepeatCount:(float)number];

Penso che -1 per il numero dovrebbe essere ripetuto indefinitamente, ma non ne sono sicuro al 100%.