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 № 1Il 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%.