modifier une NSImage |
Bienvenue invité ( Connexion | Inscription )
modifier une NSImage |
10 May 2004, 09:56
Message
#1
|
|
Adepte de Macbidouille Groupe : Membres Messages : 112 Inscrit : 22 Dec 2003 Membre no 12 727 |
Bonjour forum,
Dans une sous classe de NSCell, j' utilise des images issues d' un fichier .tiff. A l'initialisation, je souhaite faire une transformation sur ces images. Donc j'utilise le code suivant pour copier image2 sur image1 et image4 sur image3 : CODE - (id)init{ image1 = [NSImage imageNamed: @"image1"]; image2 = [NSImage imageNamed: @"image2"]; image3 = [NSImage imageNamed: @"image3"]; image4 = [NSImage imageNamed: @"image4"]; [ image1 lockFocus]; [ image2 compositeToPoint:NSZeroPoint operation: NSCompositeCopy]; [ image1 unlockFocus]; [ image3 lockFocus]; [ image4 compositeToPoint:NSZeroPoint operation: NSCompositeCopy]; [ image3 unlockFocus]; return self; } Pour dessiner les cellules, il y a la méthode suivante: - (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)controlView Problème: quand j'utilise image1 comme image de la cellule, le résultat est une image1 avec desus image2 ET image4. D'ou vient ce problème ? du choix de la méthode init ? du code pour modifier l' image ? autre ? Merci.Romain. Ce message a été modifié par romainB - 10 May 2004, 11:21. |
|
|
10 May 2004, 10:45
Message
#2
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 6 580 Inscrit : 20 Mar 2003 Membre no 6 765 |
Peut-être parceque tu verrouilles le focus sur image1, mais déverrouilles sur image2 ?
-------------------- késtananafout' (:
|
|
|
10 May 2004, 10:53
Message
#3
|
|
Adepte de Macbidouille Groupe : Membres Messages : 112 Inscrit : 22 Dec 2003 Membre no 12 727 |
c' est une coquille, le problème ne vient pas de là. Mais merci, j'ai corrigé.
|
|
|
10 May 2004, 12:56
Message
#4
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 516 Inscrit : 7 Oct 2001 Membre no 962 |
Je suppose que la méthode init est celle de ta sous classe NSCell ?
Dans ce cas (à moins de l'avoir fait), n'oublie pas de "retain" tes images (car imageNamed retourne un object en autorelease). Peux tu aussi nous fournir le code de la méthode drawInteriorWithFrame:inView: ? afin de voir ce qui s'y passe... . |
|
|
10 May 2004, 15:07
Message
#5
|
|
Adepte de Macbidouille Groupe : Membres Messages : 112 Inscrit : 22 Dec 2003 Membre no 12 727 |
La méthode init est celle de NSImageCell.
Ce que j' essaie de faire, c'est une sous-classe de NSMatrix pour avoir une matrix qui ressemble à la barre des TabView dans Panther mais sans les tabs. Il y a ce genre de controle dans iCal ou iPhoto. Voilà les sous classes de NSMatrix et NSImageCell. L' idée c'est que la NSImageCell dessine l' image de fond en redimentionnant une image centrale ("normal-fill") et ensuite ajoute les bords droits ou gauche sur l'image en fonction de la position dans la matrix. Dans le code, j'ai viré -(id)init pour simplifier mais il faudrait le rajouter. Le problème est donc que toutes les cellules de la matrix sont dessinées avec les bords droits ET gauche. Ca vient peut-être de la condition pour repérer la cellule dans la matrix, ou alors de l'image qui garde en cache les modifs ... Je patauge car difficile à déboguer. Si vous voulez recréer le projet, c'est facile, il suffit de sous classer une custom view dans IB en MyMatrix et d'ajouter MyMatrix.m et MyMatrix.h à xcode. Les 3 images proviennent des ressources de iCal et ont le même nom de fichier. CODE #import "MyMatrix.h"
#define NbColumns (int)3 @implementation MyImageCell - (void)drawInteriorWithFrame:(NSRect)theFrame inView:(NSView *)theView { NSLog(@"drawWithFrame:" ); NSImage *theImage; NSImage *capImage; NSPoint point; // "normal-fill.tiff" est l'image centrale theImage = [NSImage imageNamed: @"normal-fill"]; [theImage setScalesWhenResized:YES]; [theImage setSize:theFrame.size ]; // DEBUT Ajouter les bords droit ou gauche à l'image if ([(MyMatrix*)theView cellAtRow:0 column:0] == self ) { NSLog(@"first column" ); capImage = [NSImage imageNamed: @"normal-cap-left"]; point = NSZeroPoint; } else if ([(MyMatrix*)theView cellAtRow:0 column: NbColumns-1] == self ) { NSLog(@"third column" ); capImage = [NSImage imageNamed: @"normal-cap-right"]; int capImageWidth = [capImage size].width; point = NSMakePoint((int)theFrame.size.width - capImageWidth,0); } [ theImage lockFocus]; [ capImage compositeToPoint: point operation: NSCompositeCopy]; [ theImage unlockFocus]; // FIN Ajouter les bords droit ou gauche à l'image [ self setImage:theImage]; [ super drawInteriorWithFrame:theFrame inView:theView]; } @end @implementation MyMatrix - (id)initWithFrame:(NSRect)frameRect { id cell = [[MyImageCell alloc] init]; // create the cell prototype and style it [cell setImageAlignment:NSImageAlignCenter]; [cell setImageFrameStyle:NSImageFrameNone]; [cell setEnabled:YES]; // create the actual matrix of buttons [super initWithFrame:frameRect mode:NSListModeMatrix prototype:cell numberOfRows:1 numberOfColumns:NbColumns]; [self setDrawsBackground:YES]; // configure the size and spacing of buttons // use the width of the superview (the scroller) [cell release]; [self setCellSize:NSMakeSize((int)frameRect.size.width /NbColumns ,23)]; [self setIntercellSpacing:NSMakeSize(1,0)]; return self; } @end |
|
|
10 May 2004, 22:17
Message
#6
|
|
Macbidouilleur de vermeil ! Groupe : Membres Messages : 933 Inscrit : 2 Jun 2002 Lieu : France Membre no 2 604 |
QUOTE (romainB @ 10 May 2004, 15:07) La méthode init est celle de NSImageCell. Ce que j' essaie de faire, c'est une sous-classe de NSMatrix pour avoir une matrix qui ressemble à la barre des TabView dans Panther mais sans les tabs. Il y a ce genre de controle dans iCal ou iPhoto. J'ai déjà codé ce genre de truc et en fait c'est NSButtonCell que j'ai dérivé de mon côté. Je me servais des alignements de texte et image pour savoir à quelle type de cellule j'avais affaire. Si tu ne cherches qu'à être compatible Panther, il y a maintenant une classe de base qui permet d'avoir ce contrôle. |
|
|
11 May 2004, 09:18
Message
#7
|
|
Adepte de Macbidouille Groupe : Membres Messages : 112 Inscrit : 22 Dec 2003 Membre no 12 727 |
Je viens de découvrir la classe dont tu parles, c'est exactement ce que je cherchais. Pour ceux que ça interresse, ça s'appelle NSSegmentedControl (10.3 only) et c'est bien caché dans la doc (rien dans l'interface de IB).
Je vais utiliser plutot ce truc même si j' aimerais bien savoir d'où vient le problème avec les images qui se superposent dans le code au dessus. Autre question pour aller plus loin: ce controle (NSSegmentedControl) permet d' avoir une apparence à la iCal (le bouton semaine/mois/année) mais pas tout à fait. En effet, dans iCal il y a des flèches sur les cotés qui permettent d' incrémenter une valeur. On peut reproduire ce fonctionnement en connectant une action au controle et en examinant la position du segment sélectionné. La seule différence, c'est que le segment se sélectionne alors que dans iCal il est du type MomentaryLight. J' ai essayé de sous-classer NSSegmentedCell pour changer le type de cellule à l'initialisation mais je ne trouve pas la méthode adaptée. Si quelqu'un a déjà utilisé NSSegmentedCell et sait comment ça marche, je suis preneur. A+ . Romain. |
|
|
12 May 2004, 10:17
Message
#8
|
|
Adepte de Macbidouille Groupe : Membres Messages : 52 Inscrit : 31 Jul 2001 Lieu : Metz Membre no 577 |
QUOTE (romainB @ 11 May 2004, 08:18) Je viens de découvrir la classe dont tu parles, c'est exactement ce que je cherchais. Pour ceux que ça interresse, ça s'appelle NSSegmentedControl (10.3 only) et c'est bien caché dans la doc (rien dans l'interface de IB). Je vais utiliser plutot ce truc même si j' aimerais bien savoir d'où vient le problème avec les images qui se superposent dans le code au dessus. Autre question pour aller plus loin: ce controle (NSSegmentedControl) permet d' avoir une apparence à la iCal (le bouton semaine/mois/année) mais pas tout à fait. En effet, dans iCal il y a des flèches sur les cotés qui permettent d' incrémenter une valeur. On peut reproduire ce fonctionnement en connectant une action au controle et en examinant la position du segment sélectionné. La seule différence, c'est que le segment se sélectionne alors que dans iCal il est du type MomentaryLight. J' ai essayé de sous-classer NSSegmentedCell pour changer le type de cellule à l'initialisation mais je ne trouve pas la méthode adaptée. Si quelqu'un a déjà utilisé NSSegmentedCell et sait comment ça marche, je suis preneur. A+ . Romain. Voilà la doc elle est assez explicite : Using Segmented Control En fait la majorité des options de configuration sont implémentées dans le NSSegmentedCell. |
|
|
Nous sommes le : 26th April 2024 - 21:09 |