2010-08-19 7 views
0

Une question fréquemment répondue, j'ai peur mais je suis à peu près dans le noir sur ceci.ne peut pas obtenir setNeedsDisplay pour fonctionner dans une boucle pour UIImageView

Dans mon contrôleur de vue, j'ai la méthode suivante pour revenir et en avant entre deux images un total de 5 fois

- (IBAction)cycle{ 

BOOL select1; 
select1=YES; 

UIImage *image1 = [UIImage imageNamed:@"image1.png"]; 
UIImage *image2 = [UIImage imageNamed:@"image2.png"]; 

for (int i=0; i<5; i++) { 

    if (select1){ 
    [imageview setImage:image1]; 
    } else { 
    [imageview setImage:image2]; 
    } 

    [NSThread sleepForTimeInterval:1.0]; 

    [imageview setNeedsDisplay]; 

} 
} 

Le problème est que le message setNeedsDisplay ne fonctionne pas dans la boucle et la vue est seulement mis à jour lorsque la méthode se ferme.

Y at-il quelque chose que je peux faire ici? Est-ce que l'approche est faisable ou suis-je complètement sur la mauvaise voie? C'est vraiment un programme de test (je suis nouveau dans ce langage) mais il serait utile de contrôler quelque chose comme ça par programmation. L'application de l'étape suivante mettra en œuvre des changements aléatoires entre les changements d'image.

Quelqu'un peut-il m'aider à ce sujet?

Répondre

1

Mauvaise piste. Appeler

[NSThread sleepForTimeInterval:1.0]; 

N'essaie que de mettre le thread principal en veille. Le problème est que c'est le thread qui fait le dessin. Vous devez terminer ce que vous faites et donner le contrôle de bakc au runtime de NS pour qu'il puisse mettre à jour les éléments gui. Essayez d'utiliser NSTimer pour créer un temporisateur planifié.

Faites-le répéter avec l'intervalle de temps que vous voulez. Tout ce que vous avez alors à faire est de définir l'image:

if (select1){  
    [imageview setImage:image1];  
    } else {  
    [imageview setImage:image2];  
    } 

il n'y a pas besoin de

[imageview setNeedsDisplay]; 

Comme le imageview se chargera que pour lui-même.

+0

C'est * légèrement * plus compliqué que ça. Le thread principal fait le "affichage" (- [CALayer display] ou CALayerDelegate -displayLayer). Lorsque vous revenez à la boucle d'exécution, UIKit appelle CATransactionCommit() ou quelque chose, qui "affiche" tous vos calques (les restituant dans la propriété CALayer.content). CoreAnimation récupère ensuite les modifications et les résultats sont combinés dans le thread CoreAnimation et sur le GPU. Lorsque cela est fait, CoreAnimation effectue un buffer-flip et vous voyez les résultats à l'écran. Beaucoup de tampons partout! –

+0

@tc: mon chapeau est à toi. C'est un niveau impressionnant de connaissances que vous avez là. Je suis jaloux et je vais faire un peu de lecture. –

+0

Merveilleux. Tout fonctionne maintenant. Tous ont du sens et ont beaucoup appris, c'est-à-dire à propos de NSTimer. setNeedsDisplay est en effet redondant. Merci beaucoup pour cela. – drw

Questions connexes