Rotation d'image se bloque
cocoacola71
Membre
Bonjour à vous.
Mon but est simple, mais il semblerait que graphiquement un problème survient.
J'ai un NSToolBarItem (Nom : majItem) dans lequel une image est présente. Le principe est de mettre en mouvement l'image par une rotation.
Cela fonctionne, hors j'ai une boucle qui permet la rotation toutes les 500ms mais on dirait que le graphisme ne suite pas :
Je ne comprend pas l'erreur (qui doit être une belle erreur de débutant /crazy.gif' class='bbc_emoticon' alt=' ' /> )
Si quelqu'un à une idée...
Merci.
Mon but est simple, mais il semblerait que graphiquement un problème survient.
J'ai un NSToolBarItem (Nom : majItem) dans lequel une image est présente. Le principe est de mettre en mouvement l'image par une rotation.
Cela fonctionne, hors j'ai une boucle qui permet la rotation toutes les 500ms mais on dirait que le graphisme ne suite pas :
<br />
NSAutoreleasePool *poolMAJ = [[NSAutoreleasePool alloc]init];<br />
<br />
double rotationDeg = 20.0;<br />
<br />
//Recuperation Image et Taille<br />
NSImage *origin = [NSImage imageNamed:@"MAJ1.png"];<br />
NSSize imageSize = [origin size];<br />
NSImage *rotateImage = [[NSImage alloc] initWithSize:imageSize];<br />
<br />
//Définition du centre de l'image (coordonnées)<br />
NSPoint center = NSMakePoint(imageSize.width / 2.0, imageSize.height / 2.0);<br />
<br />
NSAffineTransform *transform = [NSAffineTransform transform]; <br />
<br />
<br />
//Lancement du traitement<br />
while(YES)<br />
{<br />
[rotateImage lockFocus];<br />
[transform translateXBy:center.x yBy:center.y];<br />
[transform rotateByDegrees:rotationDeg];<br />
[transform translateXBy:-center.x yBy:-center.y];<br />
[transform concat];<br />
<br />
//Prise ne charge des modifications<br />
[origin drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];<br />
[rotateImage unlockFocus];<br />
<br />
//Changement de l'image<br />
[majItem setImage:rotateImage];<br />
<br />
<br />
if(rotationDeg == 360.0)<br />
rotationDeg = 20.0;<br />
else<br />
rotationDeg = rotationDeg + 20.0;<br />
<br />
NSLog(@"degres rotation : %f",rotationDeg);<br />
[NSThread sleepForTimeInterval:0.5];<br />
}<br />
[poolMAJ release];<br />
[NSThread exit];<br />
Le tout est dans un thread.Je ne comprend pas l'erreur (qui doit être une belle erreur de débutant /crazy.gif' class='bbc_emoticon' alt=' ' /> )
Si quelqu'un à une idée...
Merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Merci de tes réponses, je lance mon thread par un detachNewThreadSelector:
Ma rotation est seulement prise en compte lorsque while n'est pas présent
Je vais explorer tes solutions /smile.png' class='bbc_emoticon' alt=':)' />
Mais maintenant j'ai Exc-bad-access sur ma ligne:
Par contre et ce que je ne comprend pas, la rotation est parfois lente et parfois très rapide!
Modif : Cela venait des mon angle maximum pour ce qui concerne la lenteur et la rapidité de la rotation
L'erreur provient du chargement du webview, hors si j'utilise constamment display cela me produit des erreurs lorsque je navigue sur l'application.
Le mieux pour moi serait de rafraà®chir directement NSToolBarItem, cela est possible??
Merci
En cas, un setNeedsDisplay doit suffire.
Quelle webview?
Et lorsque j'utilise mon webiew ou d'autre élément cela ralentit mon thread et lui fait perdre le cours de son exécution.
Par exemple, j'incrémente de 1 degré ma rotation (Mon NSLog m'affiche chaque degrés), hors lorsque j'utilise mon webview ou un autre élément il m'arrive d'incrémenté de 8 degrés d'un coup ou même de revenir en arrière.
Pourtant ma boucle est clair :
D'autre part:
/color][color=#660066]NSThread[/color][color=#000000] [/color][color=#000088]exit[/color][color=#666600;
est inutile et dangereux !
Le thread est tué au retour de la méthode main.
C'est ce qu'il me semblait aussi.
J'ai l'impression que c'est le main thread qui sature au niveau rafraichissement avec la webview.
Non, l'image tu l'as calculé dans ton thread. Le setImage ne va faire que la stocker et taguer la vue comme étant à rafraà®chir.
et donc supprimer la ligne :
Cela fonctionne correctement /smile.png' class='bbc_emoticon' alt=':)' /> hors lorsque j'utilise mon webview mon thread perd le cours de son exécution et fait n'importe quoi.
Il saute des incrémentation ou revient en arrière... Ma rotation est horrible /crazy.gif' class='bbc_emoticon' alt=' ' />
Du coup, tu ne laisses pas le choix au main thread. Il doit afficher l'image immédiatement. C'est le seul moyen d'améliorer les choses mais je ne sais pas si ce sera suffisant en terme de fluidité de rendu.