Déplacement des UIButtons

Bonjour



Dans mon projet, je souhaite que lorsque j'appuie sur un bouton, il déplace "monBouton" vers une position que j'ai définie dans mon code. J'utilise donc ce morceau de code :
<br />
bool changement;<br />
- (IBAction)changerLaPosition:(id)sender {<br />
	if (&#33;changement) {<br />
		self.monBouton.frame = CGRectMake(135, 120, 50, 50);<br />
		changement = true;<br />
	}<br />
	else {<br />
		self.monBouton.frame = CGRectMake(135, 250, 50, 50);<br />
		changement = false;<br />
	}<br />
}<br />




Le problème est que je n'ai pas qu'un bouton à  déplacer mais un peu plus de dix et les lignes de code commences à  se répéter... image/sad.png' class='bbc_emoticon' alt=':(' /> Je joins l'interface de mon projet pour vous en faire une petite idée.



Quelqu'un aurait-il une idée de comment réduire ces lignes ?



Merci image/smile.png' class='bbc_emoticon' alt=':)' />
Mots clés:

Réponses

  • AliGatorAliGator Membre, Modérateur
    Bah heu la même chose que pour ton autre cas où tu avais à  modifier l'état selected des boutons... tu fais une boucle "for"...

    (Là  si tu vois pas la solution c'est qd mm qu'il te manque de sacré bases...)
  • Oui mais les boutons ont une positions différentes. Pour le problème avec les images, il y a plusieurs états et on peut les changer. Alors que pour la position, on a pas recourt aux états "selected", "highlighted"... L'histoire de la boucle "for" j'ai très bien compris ! image/smile.png' class='bbc_emoticon' alt=':)' />
  • AliGatorAliGator Membre, Modérateur
    Bah en même temps tu ne nous donnes pas trop de précision sur ce que tu veux faire... Tes positions, elles sont calculables ? Genre le bouton n°i va à  la position {x=100*i, y = 20+40*i } ou un truc comme ça ? Ou pas du tout ? Est-ce que x et y doivent changer, ou que x ou que y ? Etc... décris un peu mieux ton problème sinon on aura du mal à  proposer des pistes.



    PS : Arrête de suite ta manie d'utiliser des variables globales comme "changement", ce n'est pas la bonne méthode est fortement déconseillé. Utilises plutôt par exemple l'état selected de ton sender (que tu bascules à  chaque fois). Ou utilise un UISwitch qui va te permettre d'avoir un interrupteur qui va basculer entre deux états "on" et "off".
  • BenjoBenjo Membre
    septembre 2012 modifié #5


    [font=helvetica, arial, sans-serif]Bah en même temps tu ne nous donnes pas trop de précision sur ce que tu veux faire... Tes positions, elles sont calculables ? Genre le bouton n°i va à  la position {x=100*i, y = 20+40*i } ou un truc comme ça ? Ou pas du tout ? Est-ce que x et y doivent changer, ou que x ou que y ?[/font]




    Non je ne peux pas calculer la positions de mes boutons. X et Y ne changent pas tout le temps mais il peut arriver que X tout seul change, Y tout seul change et X et Y changent.



    En fait j'ai mis une action dans mon code mais c'est en fait cette méthode qui fera changer mes boutons de place :


    <br />
    -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration<br />
    





    [font=helvetica, arial, sans-serif]Ou utilise un UISwitch qui va te permettre d'avoir un interrupteur qui va basculer entre deux états "on" et "off".[/font]




    J'ai utilisé une variable globale parce que dans la méthode ci-dessus, je n'ai pas de sender. Mais oui je vais arrêter tout de suite cette manie et comme tu dis, je vais utiliser un UISwitch dans les cas où je n'aurais pas de sender ! image/smile.png' class='bbc_emoticon' alt=':)' />



    Juste une petite question : À quoi servent les boolean si je doit éviter des les utiliser ?
  • AliGatorAliGator Membre, Modérateur
    J'ai pas dit d'éviter d'utiliser les boolean, j'ai dit d'éviter d'utiliser les variables globales. Ca n'a rien à  voir.

    Les boolean, c'est très bien. Les variables globales, c'est le mal (encore + en environnement MultiThreadé) et surtout souvent utilisé à  mauvais escient. En général on peut faire autrement ; par exemple dans ton cas tu peux te baser sur la valeur de toInterfaceOrientation pour savoir si tu te trouves dans un cas (Portrait) ou l'autre (Paysage), plutôt que d'avoir une variable globale "changement".



    Sinon pour ton problème, il te suffit de prévoir un tableau de CGPoint que tu stockes qqpart (dans une propriété de ton UIViewController typiquement). Et comme ça tu n'as plus qu'à  boucler sur tous tes boutons pour modifier leur frame avec comme valeur de X et Y la valeur du i-ème CGPoint de ton tableau.
  • BenjoBenjo Membre
    septembre 2012 modifié #7
    Super merci ! image/smile.png' class='bbc_emoticon' alt=':)' /> J'ai essayé ta solution et sa marche super bien ! Voici comment j'ai codé ça :


    <br />
    - (void)viewDidLoad<br />
    {<br />
    	[super viewDidLoad];<br />
    	positionPortrait = [NSMutableArray array];<br />
    	[positionPortrait addObject:[NSValue valueWithCGRect:CGRectMake(93, 205, 50, 50)]];<br />
    	[positionPortrait addObject:[NSValue valueWithCGRect:CGRectMake(177, 205, 50, 50)]];<br />
      <br />
    	positionPaysage = [NSMutableArray array];<br />
    	[positionPaysage addObject:[NSValue valueWithCGRect:CGRectMake(0, 0, 50, 50)]];<br />
    	[positionPaysage addObject:[NSValue valueWithCGRect:CGRectMake(100, 100, 50, 50)]];<br />
    }<br />
    -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {<br />
    	int i = 0;<br />
    	if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {<br />
    		for (UIButton *btn in boutons) {<br />
    			btn.frame = [[positionPortrait objectAtIndex:i] CGRectValue];<br />
    			i++;<br />
    		}<br />
    	}<br />
    	else {<br />
    		for (UIButton *btn in boutons) {<br />
    			btn.frame = [[positionPaysage objectAtIndex:i] CGRectValue];<br />
    			i++;<br />
    		}<br />
    	}<br />
    }<br />
    




    Pourrais-tu juste vérifier si mon code est juste ?



    J'ai utiliser des CGRectMake parce que mes boutons doivent changer de taille à  un moment, mais je ne les aient pas fait changer dans mon exemple.




    [font=helvetica, arial, sans-serif]En général on peut faire autrement ; par exemple dans ton cas tu peux te baser sur la valeur de toInterfaceOrientation pour savoir si tu te trouves dans un cas (Portrait) ou l'autre (Paysage), plutôt que d'avoir une variable globale "changement".[/font]




    Oui j'utilise toujours la valeur "toInterfaceOrientation" lorsque j'utilise le mode portrait et paysage.
  • AliGatorAliGator Membre, Modérateur
    Oui ton code est bon, pas de soucis.



    J'utiliserais à  la rigueur le tag des UIButtons plutôt qu'un index i pour faire correspondre le bouton et son CGRect, histoire de ne pas me baser sur l'ordre des UIButtons dans ton IBOutletCollection car comme je l'ai déjà  mentionné je ne suis pas sûr que cet ordre soit garanti. Alors qu'en affectant des tags dans IB à  chacun de tes boutons et en utilisant ce tag, tu es sûr d'utiliser le bon élément de ton tableau.


  • [font=helvetica, arial, sans-serif]Oui ton code est bon, pas de soucis.[/font]




    Merci !




    [font=helvetica, arial, sans-serif]J'utiliserais à  la rigueur le tag des UIButtons plutôt qu'un index i pour faire correspondre le bouton et son CGRect, histoire de ne pas me baser sur l'ordre des UIButtons dans ton IBOutletCollection car comme je l'ai déjà  mentionné je ne suis pas sûr que cet ordre soit garanti. Alors qu'en affectant des tags dans IB à  chacun de tes boutons et en utilisant ce tag, tu es sûr d'utiliser le bon élément de ton tableau.[/font]




    Ha oui j'allais justement poser une question sur l'ordre des "[font=helvetica, arial, sans-serif] IBOutletCollection". Effectivement je pourrais utiliser les tags ce qui me permettrai d'utiliser le bon élément de mon tableau.[/font]



    [font=helvetica, arial, sans-serif]Merci beaucoup pour tes réponses ![/font]
Connectez-vous ou Inscrivez-vous pour répondre.