Créer une pause dans le programme
Fred20
Membre
Bonjour
Mon objectif est le suivant : en cliquant sur un bouton, je souhaite que cela fasse apparaà®tre 3 autres boutons ("echelle" "ptADigit" "mizeAZero") . Cependant, je voudrais que ces boutons apparaissent les uns à la suite des autres, à 0,3 secondes d'intervalle.
J'ai essayé avec NSTimer, mais je n'obtiens pas le résultat voulu : mon 2e bouton n'apparaà®t pas et en revanche, mon 3e apparait bien à 0,3 seconde. Qu'ai-je oublié ??
voici mon code
Merci d'avance
Mon objectif est le suivant : en cliquant sur un bouton, je souhaite que cela fasse apparaà®tre 3 autres boutons ("echelle" "ptADigit" "mizeAZero") . Cependant, je voudrais que ces boutons apparaissent les uns à la suite des autres, à 0,3 secondes d'intervalle.
J'ai essayé avec NSTimer, mais je n'obtiens pas le résultat voulu : mon 2e bouton n'apparaà®t pas et en revanche, mon 3e apparait bien à 0,3 seconde. Qu'ai-je oublié ??
voici mon code
<br />
//----------------------------------------------------------------------------------------------<br />
-(void) maMethode:(NSTimer *)aTimer // n'est pas déclaréee : elle est demandée en scheduledTimerWithTimeInterval<br />
{<br />
[nomBouton setHidden:NO];<br />
NSLog(@" passé ds maMethode");<br />
<br />
// si je mets cela dans le else de "pause", je reste dans "maMethode"<br />
[timer invalidate];<br />
[timer release];<br />
timer = nil;<br />
}<br />
<br />
//----------------------------------------------------------------------------------------------<br />
-(void) pause : (NSButton *)bouton<br />
{<br />
nomBouton = bouton;<br />
<br />
if(timer == nil)<br />
{<br />
timer = [[NSTimer scheduledTimerWithTimeInterval:0.3<br />
target:self<br />
selector:@selector(maMethode:)<br />
userInfo:nil<br />
repeats:YES] retain];<br />
NSLog(@" passé ds pause : debut");<br />
}else {<br />
NSLog(@" passé ds pause : fin");<br />
<br />
<br />
}<br />
NSLog(@" passé ds pause : fin - fin");<br />
}<br />
<br />
//----------------------------------------------------------------------------------------------<br />
-(IBAction) parametre: (id)sender;<br />
{<br />
<br />
[echelle setHidden:NO];<br />
[self pause:ptADigit];<br />
[self pause:mizeAZero];<br />
<br />
}<br />
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Dans un premier temps, je pense que ta variable "timer" est globale. Donc pas besoin de faire un retain/release supplémentaire.
Cela est géré dans ton objet en global avec la méthode suivante si tu n'as pas ARC.
Après, tu peux utiliser la méthodescheduledTimerWithTimeInterval sans retain, c'est une méthode static.
Ensuite, il faut vérifier que ton StoryBoard paramètre bien tous tes boutons.
Question bête : "maMethode", je suppose que c'est un exemple. Car tu mets en setHidden:NO qu'un seul bouton.
Karoxys.
Pourquoi ne pas faire ça avec CoreAnimation ?
Et voilà , tout concentré en un seul endroit, pas besoin de timer, et en prime tu as une animation avec un fondu enchaà®né (apparition progressive)
Pour plus d'infos, lire la doc de UIView, le View Programming Guide, la doc sur les blocks...
Créer une méthode pause:
Quitte à ne pas vouloir d'animation mais juste une pause, autant faire ça avec GCD et dispatch_after dans ce cas /tongue.png' class='bbc_emoticon' alt=':P' />
Mais bon, quitte à faire apparaà®tre les boutons à 0.3s d'intervale, autant en profiter pour les faire apparaà®tre de façon animée.
J'ai proposé comme animation simple de jouer sur l'alpha. On pourrait imaginer plein d'autres choses, comme les faire grossir, les faire pousser comme des champignons, et ce de façon très simple grâce aux méthodes de UIView /smile.png' class='bbc_emoticon' alt=':)' />
On est sur le forum Cocoa là /tongue.png' class='bbc_emoticon' alt=':P' />
Avec OSX et NSView si on veut la même chose il faut passer par CoreAnimation. Mais bon les propriétés transform et alpha de CALayer ont une animation implicite si je ne m'abuse, non ? Donc l'équivalent pour OSX ne devrait pas être trop méchant non plus ! Après un setWantsLayer:YES sur le bouton, un button1.layer.transform = ... va animer la propriété puisque transform possède une implicit animation. Au pire on peut toujours créer un CAAnimation pour personaliser l'animation /wink.png' class='bbc_emoticon' alt=';)' />
Merci et je vous tiens au courant
Oui, en passant par le proxy animator de NSView.
Je viens de lire avec attention toutes vos propositions.
Pour répondre à Karoxys, oui il s'agit bien d'un exemple. C'est plus pour comprendre le principe. De plus c'est quoi un "storyBoard"
Sinon, mergand, peux tu m'expliquer les "runloop", en allant sur la doc, je dois avouer que je n'ai pas compris grand chose...
Enfin AliGator, c'est vrai que ta solution semble super mais je vais peut être attendre de maitriser un peu plus, d'autant qu'il semble que sur OSX ça ne semble pas si évident !!
Merci encore
J'utilise pas, mais si j'ai bien capté, comme son nom l'indique, tu crées un " scénario " pour la suite des view...
La runloop est le mécanisme de distribution des événements dans Cocoa.
Par ex, lors de l'appui sur le touche du clavier, cet événement est transmis à l'application au premier plan, et celle-ci va transmettre ce même événement à l'objet qui a le focus (first responder) de la fenêtre active.
La runloop est utilisée par bon nombre de classes comme NSURLDownload, ainsi les données sont reçues via des méthodes delegate sans bloquer l'application, rendant inutile la création d'un thread secondaire.
Aussi ton utilisation du timer est mauvaise. Il ne faut pas mettre repeat:YES si tu ne veux pas répéter le timer, ce qui est le case ici, tu n'as pas besoin de stocker le timer et de le retain non plus, étant donné que tu ne l'exécutes qu'une fois et qu'il est déjà retenu par le runloop.
Tu peux aussi utiliser ce petit gars pour éviter de répartir le code partout: https://gist.github.com/250662
Exemple:
Au passage, la technique avec NSRunLoop complique le problème plus qu'elle ne le résout, tu n'as pas besoin d'aller aussi bas pour exécuter du code comme ça.
C'est pour cela qu'il te dit d'aller télécharger une truc sur github.