Bouger un carre dans une NSView

CoreCore Membre
22:52 modifié dans API AppKit #1
bonjour,

je dessine dans une NSView un carre avec ces lignes de code :

<br />- (void)drawRect:(NSRect)rect<br />{<br />NSRect curseur = NSMakeRect(x+0.5,y+0.5,10,10);<br />[[NSColor redColor] set];<br />[NSBezierPath strokeRect:curseur];	<br />}<br />

il se dessine pas de probleme

Maintenant j'aimerais le faire bouger sur la gauche de 20 pixels via une IBAction, nommée moveLeft par exemple, correspondant à  un bouton sur une barre d'outils. J'ai essayé quelques trucs mais rien n'y fait ca ne bouge pas ! Alors si quelqu'un pouvait m'aider...merci d'avance

Réponses

  • cbrandtcbrandt Membre
    janvier 2005 modifié #2
    salut,

    tu as bien mis un display dans le moveLeft de ta view ?

    <br />- (IBAction) moveLeft: (id) sender<br />{<br />    x -= 20;<br />    [self display];<br />}<br />
    
  • CoreCore Membre
    22:52 modifié #3
    non ca ne marche pas meme avec un [self display]

    Voici mon code :

    <br />#import &quot;MyView.h&quot;<br /><br />@implementation MyView<br /><br />float x = 100 ;<br />float y = 100 ;<br /><br />- (id)initWithFrame:(NSRect)frameRect<br />{<br />	if ((self = [super initWithFrame:frameRect]) != nil) {<br />		// Add initialization code here<br />	}<br />	return self;<br />}<br /><br />- (void)drawRect:(NSRect)rect<br />{<br />NSRect curseur = NSMakeRect(x+0.5,y+0.5,10,10);<br />[[NSColor redColor] set];<br />[NSBezierPath strokeRect:curseur];  <br />}<br /><br />- (IBAction)moveLeft:(id)sender<br />{<br />NSLog(@&quot;action!&quot;);<br />x -= 20 ;<br />[self display];<br />}<br />@end<br />
    


    L'IBAction fonctionne car la fentre de log affiche bien "action!"

    Mais le carre ne bouge pas !!??
  • Eddy58Eddy58 Membre
    22:52 modifié #4
    Essaies plutot avec ca pour raffraichir ta view : :)

    <br />- (IBAction)moveLeft:(id)sender<br />{<br />NSLog(@&quot;action!&quot;);<br />x -= 20 ;<br />[self setNeedsDisplay:YES];<br />}<br />
    
  • CoreCore Membre
    22:52 modifié #5
    Meme avec un [setNeedsDisplay:YES] ca ne marche pas, j'ai meme essayé les deux:
    <br />[self setNeedsDisplay:YES] ;<br />[self display] ;<br />
    


    J'ai donc fait un petit test en rajoutant un if dans la methode Drawrect et un test = 1 dans moveLeft

    <br />if (test == 1)<br />	{<br /><br />		NSRect curseur = NSMakeRect(x+0.5,y+0.5,10,10);<br />		[[NSColor redColor] set];<br />		[NSBezierPath strokeRect:curseur];<br />	}<br />
    


    rien ne se dessine, meme apres avoir appuyer sur le bouton reliée à  l'action moveLeft. Il semble donc que la methode drawRect ne soit pas invoquée par mon display et/ou setNeedsDisplay:YES

    Si quelqu'un peut m'expliquer comment rafraichir la NSVIew, merci d'avance !
  • 22:52 modifié #6
    Chez moi ton code marche parfaitement, à  une différence près l'origine du rect.

    1. Essaye de faire un NSLog(NSStringFromRect(curseur)); dans le drawRect et regarde si le rectangle affiché a les bonnes coordonnées.

    2. Le 0 en cocoa est en bas à  gauche (généralement il est en haut gauche), est-ce que le bas de ta vue n'est par exemple pas masqué par autre chose?
  • Eddy58Eddy58 Membre
    janvier 2005 modifié #7
    Un setNeedsDisplay:YES appelle immanquablement ta méthode drawRect....
    D'abord ce que je ferais, c'est de mettre tes variables x et y en global dans ton interfaçage, car la c'est pas propre de mettre ca en début d'implémentation et le problème vient peut-être de là ...
    Insère aussi un NSLog dans drawRect pour surveiller ta variable et vérifier du meme coup si la méthode est bien appelée... :)

    [EDIT] Zut, grilled par Renaud ;)
  • CoreCore Membre
    22:52 modifié #8
    J'ai fais les test avec un NSLog dans la methode drawRect et apparement meme avec mon setNeedDisplay:YES elle n'est pas appelée
    peut etre je fais quelque chose de faux dans IB :

    Dans interface builder je :

    _ je cree une classe qui hérite de NSView
    _ je glisse une NSView dans la fenetre
    _ je fais Custom Class et je choisi la classe que je viens de creer
    _ j'ajoute une action moveLeft à  lo classe que je viens de creer
    _ je crée une instance de classe
    _ je dispose un bouton que je connecte a cette instance avec l'action moveLeft

    après dans X Code je mets le code vu ci dessus

    et le carré ne bouge pas !

    > à  Eddy58, j'ai placé float x et float y en variable d'instance dans mon .h, est ce mieux ?

    Merci pour votre soutien !
  • BruBru Membre
    janvier 2005 modifié #9
    dans 1105296323:

    _ je crée une instance de classe
    _ je dispose un bouton que je connecte a cette instance avec l'action moveLeft


    Voilà  ton erreur !
    En fait, tu as crée 2 objets de ta classe. L'un est utilisé dans la fenêtre dans laquelle tu as glissé la custom view, l'autre est celui créé quand tu instancies ta classe. Or cette seconde view n'est reliée à  aucune fenêtre, donc elle n'est pas visible.

    Aussi, comme l'action de ton bouton est relié à  la seconde view (celle qui n'est pas visible), tu ne modifies les x et y que de cette view, et non celle de la première (la visible dans la fenêtre).

    Passe plutôt par un contrôleur pour lier ton curseur à  ta view (la première).

    .
  • CoreCore Membre
    22:52 modifié #10
    Ca marche !


  • CoreCore Membre
    22:52 modifié #11
    dans 1105280156:

    2. Le 0 en cocoa est en bas à  gauche (généralement il est en haut gauche), est-ce que le bas de ta vue n'est par exemple pas masqué par autre chose?


    Y a pas un moyen de faire un flip pour avoir le 0 en haut à  gauche ?

    Sinon mon carre se deplace correctement merci à  vous tous !!
  • BruBru Membre
    22:52 modifié #12
    dans 1105369047:

    Y a pas un moyen de faire un flip pour avoir le 0 en haut à  gauche ?


    Si.

    Dans ta custom view, implémente cette méthode :

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


    .
  • CoreCore Membre
    22:52 modifié #13
    o:)

    ce forum est genial !!!!
  • muqaddarmuqaddar Administrateur
    22:52 modifié #14
    Ce sont les gars qui répondent si vite qui sont géniaux ! ;)
  • ClicCoolClicCool Membre
    22:52 modifié #15
    dans 1105372883:

    Ce sont les gars qui répondent si vite qui sont géniaux ! ;)


    C'est pas juste une question de rapidité Alex.

    Je sais bien que toi t'avais la réponse et que t'as juste été grillé par Bru ;)

    Mais de mon côté je viens encore d'apprendre quelque chose dont je n'aurais jamais osé pensé l'existence !

    Merci Bru :)
Connectez-vous ou Inscrivez-vous pour répondre.