# NSImageView / drawRect



## POUNAS (28 Janvier 2012)

Bonjour à toutes et à tous,

voici mon problème.

j'utilise une NSImageView avec une image (fixée par setImage) - ok.

lorsque je dessine une autre image par drawRect sur mon NSImageView, l'image dessinée (self.nsImageObj dans l'exemple ci-dessous) se superpose à l'ancienne sans l'effacer.


```
- (void)drawRect:(NSRect)dirtyRect {
    NSRect zOurBounds = [self bounds];
    
    [super drawRect:dirtyRect];
    
    if (self.nsImageObj != nil)      
        [self.nsImageObj drawInRect:zOurBounds fromRect: dirtyRect operation:NSCompositeSourceOver fraction:1]; 
}
```

Comment peut-on faire pour que la nouvelle image "efface et remplace" l'ancienne image ?

j'ai essayé de faire un setImage(self.nsImageObj) : il ne se passe rien, mon NSImageView n'est pas mise à jour ! 

merci par avance.


----------



## boninmi (29 Janvier 2012)

Je n'y connais pas grand chose sur ce point précis mais il semble y avoir plein de doc si tu cherches sur ce mot clé. Il y a bien l'air qu'il faut faire un setImage, mais la syntaxe n'a pas bien l'air de comporter des parenthèses.

Voir ce lien par exemple.


----------



## tatouille (29 Janvier 2012)

```
- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect]; // non jamais
}
```

si tu veux overloader une nsimageview tu dois aussi overloader setimage et ajoute setImages dans ton cas
par d'un nsview cela sera plus simple, ton image n'est jamais vue parce que 

1 - l'appele a un context graphic super personne ne fait ca premiere fois que je vois cette horreur
2 - le context n'est jamais cleared donc cela se superpose
3 - boninmi cet exemple est outdated et ce n'est pas le probleme


----------



## boninmi (30 Janvier 2012)

tatouille a dit:


> 3 - boninmi cet exemple est outdated et ce n'est pas le probleme


Si tu donnais un exemple de code vu que POUNAS et moi on a l'air aussi nul l'un que l'autre sur ce truc ?


----------



## Nyx0uf (30 Janvier 2012)

boninmi a dit:


> Si tu donnais un exemple de code vu que POUNAS et moi on a l'air aussi nul l'un que l'autre sur ce truc ?



Il a tout dit.

Au lieu de subclasser NSImageView, subclass de NSView, ensuite y a juste à implémenter drawRect: mais sans appeler super;


----------



## boninmi (30 Janvier 2012)

Nyx0uf a dit:


> Il a tout dit.
> 
> Au lieu de subclasser NSImageView, subclass de NSView, ensuite y a juste à implémenter drawRect: mais sans appeler super;



Ma question est: comment on fait ça ? 
*tatouille* m'ayant aidé à d'autres occasions, je me suis permis de poser la question.
Si *POUNAS* sait faire, je ne dis plus rien. Mais vu les erreurs apparemment grossières qu'il a commises, j'ai des doutes. 
Ayant une certaine expérience de l'enseignement de l'informatique et des langages (ce qui ne m'empêche pas d'être à un niveau très faible en Objective-C), je ne connais pas d'autre méthode pour apprendre à programmer que de donner des exemples de code.


----------



## POUNAS (1 Février 2012)

Merci à tous pour les informations. 

j'ai trouvé une solution qui marche.

Pour info boninmi je sais faire.

je suis d'accord avec toi à 100%, rien de vaut un peu de code pour apprendre.

pour info, je gère une liste d'images dans une NSCollectionView / NSBox / NSImageView.

(avec une gestion des images par NSArrayController).

La question est de savoir quels sont les avantages de subclasser NSView par rapport à NSImageView (à part [super drawRect:dirtyRect] qui ne sera plus appelé)  dans ce contexte ?


----------

