Changer l'origine du système de coordonnées

RocouRocou Membre
03:05 modifié dans API AppKit #1
le point {0,0} étant en bas à  gauche d'une vue, à  chaque fois que l'on agrandit ou rétrécit cette dernière, tout ce qui est dessiné dans cette vue, se met à  bouger.

Quelle est la meilleure solution pour éviter cela?
J'ai cru comprendre que l'on pouvait changer le point d'origine grâce à  [maVue setBoundsOrigin:newOrigin] mais cela n'a pas l'effet voulu.
Ou alors, faut-il ajouter la valeur du déplacement aux coordonnées des graphes?

Réponses

  • Philippe49Philippe49 Membre
    03:05 modifié #2
    Si tu veux que ton origine se retrouve en newOrigin, il faut faire
    &nbsp; &nbsp; NSPoint positionOfBottomLeft=NSMakePoint(-newOrigin.x,-newOrigin.y);<br />&nbsp; &nbsp; [maVue setBoundsOrigin: positionOfBottomLeft];
    
  • RocouRocou Membre
    03:05 modifié #3
    dans 1242741953:

    Si tu veux que ton origine se retrouve en newOrigin, il faut faire
    &nbsp; &nbsp; NSPoint&nbsp;positionOfBottomLeft=NSMakePoint(-newOrigin.x,-newOrigin.y);<br />&nbsp; &nbsp; [maVue setBoundsOrigin: positionOfBottomLeft];
    


    Ha Ok. Mais faut-il mettre ce code dans un endroit particulier? Je l'ai mis dans awakeFromNib, ça n'a strictement aucun effet.
  • Philippe49Philippe49 Membre
    03:05 modifié #4
    A n'importe quel endroit de ton code, au moment où il est nécessaire de changer l'origine ...
    Maintenant est-ce vraiment là  ton problème ? peux-tu en dire plus ?
  • Philippe49Philippe49 Membre
    03:05 modifié #5
    A savoir qu'en réglant simplement la vue dans le panel "view size" de IB, le scale se fait automatiquement.
  • RocouRocou Membre
    mai 2009 modifié #6
    dans 1242742910:

    A n'importe quel endroit de ton code, au moment où il est nécessaire de changer l'origine ...
    Maintenant est-ce vraiment là  ton problème ? peux-tu en dire plus ?


    Mon problème est simple:
    Sur une vue je dessine un rectangle (un de mes fameux blocs que j'évoquent dans un autre fil).
    Mettons que ce rectangle est positionné à  20 pixels du haut de ma vue.

    Si j'agrandis ma fenêtre et que ma vue est réglée sous IB pour s'agrandir aussi, mon rectangle s'éloigne du bord supérieur de ma vue puisque l'origine {0,0} s'en éloigne également.

    Si l'origine {0,0} était à  gauche, en haut de ma vue, ce phénomène n'existerait pas.


    EDIT: ça y est, j'ai compris comment fonctionnait setBoundsOrigin mais ce n'est pas cela que je veux. setBoundsOrigin ne fait que déplacer l'origine mais conserve le repère avec l'origine en bas, à  gauche. Arg!!
  • AliGatorAliGator Membre, Modérateur
    03:05 modifié #7
    Il faut que ta vue, celle qui contient tout ton "calendrier", se redimentionne entièrement... Et ensuite que tu captes l'information de ce changement de dimension pour repositionner tes objets correctement... chose que tu fais déjà  certainement dans ton drawRect, à  calculer la position où dessiner ton rectangle en fonction des paramètres de ton bloc.
    Si c'est le cas, il suffit d'appeller un "setNeedsDisplay:YES" sur ta vue (ton "calendrier") pour lui demander de se redessiner (ce qui va rappeler drawRect au moment opportun, et redessiner tes rectangles... mais si tu recalcules bien leur position en fonction des dimensions de ton "calendrier" ça devrait donc rouler tout seul)
  • RocouRocou Membre
    03:05 modifié #8
    dans 1242745736:

    Il faut que ta vue, celle qui contient tout ton "calendrier", se redimentionne entièrement... Et ensuite que tu captes l'information de ce changement de dimension pour repositionner tes objets correctement... chose que tu fais déjà  certainement dans ton drawRect, à  calculer la position où dessiner ton rectangle en fonction des paramètres de ton bloc.
    Si c'est le cas, il suffit d'appeller un "setNeedsDisplay:YES" sur ta vue (ton "calendrier") pour lui demander de se redessiner (ce qui va rappeler drawRect au moment opportun, et redessiner tes rectangles... mais si tu recalcules bien leur position en fonction des dimensions de ton "calendrier" ça devrait donc rouler tout seul)

    Ok, merci, c'était bien une solution que j'envisageais mais il me semblait plus simple de changer de système de coordonnées.
    Sur Amiga, l'origine était en haut à  gauche, ce qui facilitait bien des choses.
  • CéroceCéroce Membre, Modérateur
    03:05 modifié #9
    Il me semble que redéfinir la méthode

    - (BOOL) isFlipped<br />{<br />return YES;<br />}
    


    suffirait à  ton bonheur.
    Sache toutefois que cela change la CTM (Current Transform Matrix, voir Cocoa Drawing Guide ou Quartz 2D Programming guide), ce qui amène d'autres problèmes, par exemple, les images ou les textes s'affichant la tête en bas...
  • RocouRocou Membre
    03:05 modifié #10
    dans 1242749151:

    Il me semble que redéfinir la méthode

    - (BOOL) isFlipped<br />{<br />return YES;<br />}
    


    suffirait à  ton bonheur.
    Sache toutefois que cela change la CTM (Current Transform Matrix, voir Cocoa Drawing Guide ou Quartz 2D Programming guide), ce qui amène d'autres problèmes, par exemple, les images ou les textes s'affichant la tête en bas...

    Oui, génial, c'est exactement ce qu'il me faut! 
    Pour le moment, pas de problème de texte la tête à  l'envers.
Connectez-vous ou Inscrivez-vous pour répondre.