1

J'ai réussi à mettre en œuvre une solution à ce problème, mais le code semble plutôt inefficace et en fait, les appels de méthode retardés s'avèrent un peu gênants quand ils continuer à se déclencher si l'utilisateur a navigué vers un autre écran. Fondamentalement je veux qu'une bulle de pensée apparaisse de la tête d'un personnage, mais animée, de sorte qu'une petite bulle apparaisse, suivie d'une plus grande, d'une plus grande encore et finalement de la bulle principale qui contient alors une petite animation. J'ai réussi cela en affichant chaque bulle avec sa propre méthode, puis d'appeler les méthodes avec des retards:Une meilleure façon d'échelonner les appels de méthode/affichage 3 UIImageViews en séquence différée

- (void)showMood { 
    animating = TRUE; 
    [self showBubble1]; 
} 

- (void)showBubble1 { 
    bubble1.hidden = FALSE; 
    [self performSelector:@selector(showBubble2) withObject:nil afterDelay:kBubbleDelay]; 
} 

- (void)showBubble2 { 
    bubble2.hidden = FALSE; 
    [self performSelector:@selector(showBubble3) withObject:nil afterDelay:kBubbleDelay]; 
} 

- (void)showBubble3 { 
    bubble3.hidden = FALSE; 
    [self performSelector:@selector(showThoughtBubble) withObject:nil afterDelay:kBubbleDelay]; 
} 

- (void)showThoughtBubble { 
    thoughtBubble.hidden = FALSE; 
    [self startBubbleAnimations]; 
    [self performSelector:@selector(hideThoughtBubble) withObject:nil 

afterDelay:kAnimationDuration * kAnimationRepeatCount]; 
    } 

- (void)hideThoughtBubble { 
    bubble1.hidden = TRUE; 
    bubble2.hidden = TRUE; 
    bubble3.hidden = TRUE; 
    thoughtBubble.hidden = TRUE; 
    [bubbleAnimation stopAnimating]; 
    animating = FALSE; 
} 

Je suppose que je pourrais créer une grande animation où les bulles font partie du même cadre et chaque cadre contient une bulle de plus, mais je voulais en quelque sorte pouvoir déplacer les bulles un peu dans Interface Builder et cette approche n'offre pas beaucoup de flexibilité.

Toutes les pensées seraient très appréciées.

Merci,

Michael

Répondre

0

Il y a probablement de meilleures façons de faire cette séquence, mais une simple amélioration serait de vérifier si la vue est visible avant de faire le changement. De cette façon, si la vue a été remplacée par une autre vue, ceux-ci cesseront:

- (void)showBubble1 { 
    if (bubble1.window) { // check to see if view is visible 
     bubble1.hidden = NO; 
     [self performSelector:@selector(showBubble2) withObject:nil afterDelay:kBubbleDelay]; 
    } 
} 

Aussi, je ne suis pas sûr de ce fil que vous commencez cela avec, mais assurez-vous qu'il est sur le thread principal. Les appels d'interface utilisateur ne doivent être effectués que sur le thread principal. Vous pouvez utiliser l'une des méthodes performSelectorOnMainThread: pour le démarrer sur le thread principal.