2013-07-29 3 views
0

J'ai un problème. Je souhaite animer certains boutons dans une boucle. Cela fonctionne si la séquence ne se répète pas, mais j'ai un problème quand la séquence se répète dans le tableau.Comment puis-je répéter une animation pour les boutons dans une boucle en Objective C?

- (void)flash:(id)sender delay:(int)time; 
{ 
    UIButton *button = (UIButton *)sender;  
    NSTimeInterval duration = 1;  
    [UIView animateWithDuration:duration 
          delay:time + 0.5 
         options:UIViewAnimationOptionAutoreverse 
         animations:^{ 
          [button setAlpha:0.1f]; 
         } completion:^(BOOL finished) { 
          [button setAlpha:1.0f]; 
         } 
     ]; 
} 

(cette méthode fonctionne avec succès, où j'appelle la méthode "flash")

- (void) play: (id)sender 
{ 
    //buttons is a array that contains buttons => 
    //buttons = [right, left, up, down, nil] 


    //positions is a sequence of the buttons positions 
    //if buttons positions is [0,1,2,3] 
    //positions have the random positions of buttons, example: 
    //positions = [0, 3, 4, 5,8, 7,9] 


    int randomNumber; 
    NSNumber *index; 

    randomNumber = (arc4random() % 4); 
    [positions addObject: [NSNumber numberWithInteger:randomNumber]]; 
    UIButton *btn;  

    for(int i=0; i<[positions count]; i++) 
    { 
     index = [positions objectAtIndex:i]; 
     btn = [buttons objectAtIndex:[index intValue]]; 
     [self flash:btn delay:i];   



    } 

} 

si la séquence des positions ne se répète pas, par exemple: positions = [1,2,3 , 0], le problème n'a pas de problème. Mais si la séquence est par exemple: positions = [0,0,0,1] (il répète les nombres), le programme n'affiche pas l'animation.

+0

Je pense que cela ne fonctionne pas, car vous annulez la première animation en l'appelant immédiatement agin lorsque vous l'essayez avec [0,0,0,1]. Vous devriez voir les boutons 0 et 1 clignoter une fois. – rdelmar

+0

@ Andrés Zorrilla avez-vous vérifié la réponse. – Ayush

Répondre

0

Cette méthode va animer la vue que vous lui passeriez.

-(void)flashingAnimation:(BOOL)boolVal forView:(UIView *) view{ 
[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionRepeat | 
UIViewAnimationOptionAutoreverse 
       animations:^{ 
        view.alpha = 0.0f; 
        view.frame = CGRectMake(view.frame.origin.x*0.75, view.frame.origin.y*0.75, view.frame.size.width*1.5, view.frame.size.height*1.5); 
       } 
        completion:^(BOOL finished){ 
        // Do nothing 
       }]; 
[UIView commitAnimations]; 
} 

Enfin appellent le method ci-dessus en passant le View vous voulez animate.

[self flashingAnimation:YES forView:Btn]

Dans ajouter des options UIViewAnimationOptionRepeat

0

Il ne fonctionne pas parce que lorsque vous appelez flash et le bouton que vous envoyez est le même que celui qui est déjà en cours d'animation l'animation est interrompue (aussi si ça n'a pas encore vraiment commencé à cause du retard). Essayez de refactoriser pour garder une trace de la synchronisation séparément et utilisez des animations sans tarder. Peut-être qu'une solution est un bloc d'achèvement qui s'appelle récursivement.

Questions connexes