2010-02-19 2 views
0

Et merci d'avance pour votre attention. J'essaye d'obtenir un petit effet d'animation dans ma simple application, en utilisant cette fois un objet UIPickerView. Fondamentalement, quand un certain événement se produit, je souhaite que mon sélecteur s'anime en sélectionnant sa dernière rangée (avec animation, bien sûr) et immédiatement après (sans autre intervention de l'utilisateur) sa première rangée (avec animation, bien sûr). Ceci, pour donner un effet "application folle" qui est censé être vraiment très spirituel, je suppose.Lazy UIPickerView - (il ne bougera pas deux fois)

donc mon code était:

[myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES]; 
[myPicker selectRow: 0 inComponent:0 animated:YES]; 

Et ce que je suis arrivé est que le sélecteur exécutera la deuxième instruction, peu importe la ligne spécifiée à l'intérieur. Il semble ignorer le premier. J'ai pensé qu'il pourrait s'agir d'une fonction 'intelligente' du compilateur qui note que deux instructions suivantes effectuent une assignation à la même variable, donc vaut mieux ignorer la première (sans tenir compte du facteur 'ANIMATED'). Je ne sais pas si c'est le cas mais j'ai essayé de déplacer ces deux instructions dans deux si les instructions sont basées sur la valeur d'un paramètre, essayant ainsi de tromper le compilateur (qui ne peut pas connaître la valeur de ces paramètres, par conséquent, il n'est pas supposé effectuer une telle optimisation). Cela n'a pas fonctionné, soit parce que je suis complètement à court de traces ou parce que le compilateur est beaucoup plus intelligent que moi. Je même pensé qu'il pourrait être un problème de retards et la séquence correcte des événements donc j'ai essayé de réécrire le code comme suivre

-(void) setPickerRowToLastRow; 
{ 
    [myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES]; 
} 
-(void) setPickerRowToFirstRow; 
{ 
    [myPicker selectRow:0 inComponent:0 animated:YES]; 
} 
         ..... 
[self performSelector: @selector(setPickerRowToLastRow) 
        withObject: nil 
        afterDelay: 1]; 
[self performSelector: @selector(setPickerRowToFirstRow) 
       withObject: nil 
       afterDelay: 1]; 

Et cela n'a pas fonctionné: le sélecteur effectue encore juste la deuxième action et il sera bouge juste une fois.

Et maintenant la question (s):

Pourquoi le mouvement sélecteur juste une fois?

Comment puis-je atteindre mon objectif (même si peut-être un peu trivial)?

Répondre

2

Cela n'a rien à voir avec le compilateur. Ce n'est pas si intelligent.

La raison pour laquelle une seule animation est effectuée est que l'animation ne démarre pas "à la fois", mais sur la prochaine boucle d'exécution (plus d'infos sur lesquelles here). À ce stade, l'animation commence, en utilisant les dernières valeurs envoyées au sélecteur. Utilisation de performSelector: withObject: afterDelay: devrait fonctionner, et la raison pour laquelle il ne l'est pas est probablement que vous mettez 1 comme délai pour les deux invocations. Réglez-le sur 0 sur le premier et 2 (par exemple) sur le second, et cela devrait fonctionner.

+0

J'ai juste essayé et fait comme vous l'avez dit, cela fonctionne (bien ... je n'étais pas si loin de la solution). Il semble fonctionner avec n'importe quel couple de paramètres de retard où le second est plus haut que le premier. Votre réponse a résolu mon problème, merci beaucoup. – user236739

Questions connexes