2010-07-13 6 views
36

J'ai connecté les deux méthodes ci-dessous pour séparer les boutons dans mon interface utilisateur mais j'ai remarqué qu'après avoir appuyé sur le bouton "VERSION 1" je ne pouvais plus appuyer sur le bouton jusqu'à la fin de la durée de l'animation. Ma compréhension était que l'animation utilise son propre thread afin de ne pas bloquer l'application principale.animateWithDuration: animations: blocage du thread principal?

// VERSION 1 
-(IBAction)fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [myLabel setAlpha:0.0]; 
    }]; 
} 

La version ancienne (ci-dessous) ne permet le bouton pour être réprimés avant que la minuterie d'animation se termine, la réinitialisation de la minuterie simplement recommencer. Si ces deux éléments fonctionnent de la même manière, ai-je oublié quelque chose ou y a-t-il eu un changement d'opération entre 3.2 et 4?

// VERSION 2 
-(IBAction)fadeUsingOld { 
    NSLog(@"V2: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.5]; 
    [myLabel setAlpha:0.0]; 
    [UIView commitAnimations]; 
} 

Vive gary

Répondre

86

Je pense que le comportement que vous voyez est parce que, par défaut, l'interaction de l'utilisateur est désactivée animation de durée avec les nouveaux appels de bloc. Vous pouvez remplacer ce en passant UIViewAnimationOptionAllowUserInteraction (appel animationWithDuration:delay:options:animations:completion), comme ceci:

-(IBAction) fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         [myLabel setAlpha:0.0]; 
        } 
        completion:nil]; 
} 
+2

Ah qui fait sens, j'avais manqué cette option dans les documents, je vais le chercher. Merci beaucoup, très apprécié. – fuzzygoat

+1

Merci pour ça. Merde, ça m'embêtait. C'est en fait assez ennuyeux que ça ne soit pas activé par défaut, car ça dit qu'il bloque l'interaction avec la vue en cours d'animation, mais en fait ça bloque toute l'interface utilisateur! – runmad

+0

Man, ne serait-ce pas bien si cela a été corrigé dans le prochain iOS 5.0 ...

1

Pour animateWithDuration :, la référence de classe ne dit rien au sujet de filetage, donc je ne suis pas sûr. Pour beginAnimations:context: and commitAnimation:, oui, ils s'exécutent dans un fil séparé UIView class Reference.

Certaines modifications de propriétés pour afficher des objets peuvent être animées (par exemple, définir les propriétés frame, bounds, center et transform). Si vous modifiez ces propriétés dans un bloc d'animation, les modifications de l'état actuel au nouvel état sont animées. Appelez la méthode beginAnimations: context: class pour commencer un bloc d'animation, définissez les propriétés que vous voulez animer, puis appelez la méthode de classe commitAnimations pour terminer un bloc d'animation. Les animations sont exécutées dans un thread distinct et démarrent lorsque l'application retourne à la boucle d'exécution. D'autres méthodes de classe d'animation vous permettent de contrôler l'heure de début, la durée, le délai et la courbe des animations dans le bloc. L'animation avec des blocs ne bloque pas le fil principal.

Questions connexes