web-dev-qa-db-fra.com

est-ce que animateWithDuration: animations: bloque le thread principal?

J'ai connecté les deux méthodes ci-dessous pour séparer les boutons de mon interface utilisateur, mais j'ai remarqué qu'après avoir appuyé sur le bouton "VERSION 1", je ne pouvais pas appuyer à nouveau sur le bouton avant la fin de la durée de l'animation dans la méthode. J'ai cru comprendre que l'animation utilise son propre thread afin de ne pas bloquer l'application principale.

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

L'ancienne version de style (ci-dessous) permet au bouton d'être réprimé avant la fin du minuteur d'animation, réinitialisant simplement le minuteur pour redémarrer. Si ces deux fonctions fonctionnent de la même manière, ai-je raté quelque chose ou y a-t-il eu un changement de fonctionnement 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];
}

Cheers gary

40
fuzzygoat

L'animation avec des blocs ne bloque pas le thread principal. Je pense que le comportement que vous voyez est dû au fait que, par défaut, l'interaction avec l'utilisateur est désactivée pendant la durée de l'animation avec les nouveaux appels de bloc. Vous pouvez remplacer cela en transmettant UIViewAnimationOptionAllowUserInteraction (appelant animationWithDuration:delay:options:animations:completion), comme ça:

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

Pour animateWithDuration :, la référence de classe ne dit rien sur le threading, donc je ne suis pas sûr.

Pour beginAnimations:context: and commitAnimation:, oui, ils s'exécutent dans un thread séparé Référence de classe UIView .

Certaines des modifications apportées aux propriétés pour afficher les objets peuvent être animées, par exemple, définir les propriétés du cadre, des limites, du centre et de la transformation. 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 souhaitez animer, puis appelez la méthode de classe commitAnimations pour terminer un bloc d'animation. Les animations sont exécutées dans un thread séparé et commencent lorsque l'application revient à 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 retard et la courbe des animations dans le bloc.

1
vodkhang