40 votes

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

J'ai branché les deux méthodes ci-dessous pour séparer les boutons dans mon INTERFACE, mais ont remarqué qu'après avoir appuyé sur la "VERSION 1" bouton que je ne pouvais pas appuyer sur le bouton jusqu'à ce que le animation durée dans le cadre de la méthode est terminée. Ma compréhension est 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'ancien style de la version (ci-dessous) ne permet pas de bouton pour être réprimés avant de l'animation de la minuterie se termine, il suffit de réinitialiser la minuterie pour démarrer de nouveau. Si ces deux fonctionnent de la même, suis-je raté quelque chose ou a-t-il eu un changement dans le 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];
}

Vive gary

93voto

zpasternack Points 10563

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

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

1voto

vodkhang Points 11222

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

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

Certains des changements de propriétés pour afficher les objets peuvent être animés-par exemple, le cadre, les limites, au centre, et des propriétés de transformation. Si vous modifiez ces propriétés dans un bloc d'animation, les modifications de l'état actuel à l'état neuf sont animés. Invoquer la beginAnimations:contexte: méthode de classe pour commencer un bloc d'animation, définissez les propriétés que vous voulez de l'animation, et ensuite appeler la commitAnimations méthode de la classe à la fin d'un bloc d'animation. Les animations sont à exécuter dans un thread séparé et commencer lorsque l'application retourne à l'exécution de la boucle. Autre animation des méthodes de la classe vous permettent de contrôler l'heure de début, durée, délai, et la courbe des animations à l'intérieur du bloc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X