[Résolu] Modifier la gestion du DragAndDrop d'une NSImageView

pixmanpixman Membre
septembre 2010 modifié dans API AppKit #1
Bonjour,

J'utilise une NSImageView pour afficher une vignette.

Mon utilisateur peut glisser une image sur celle ci afin de l'afficher.

Je souhaite pouvoir intercepter le fichier glissé sur mon imageView afin de redimentionner avant de l'affecter à  mon NSImage.
Ce qui me permet d'afficher une image plus légère, mais surtout de pouvoir valider ma NSData pour coreData.

Le code que j'ai écrit à  l'air de fonctionner, mais lorsque je glisse une image, mon aperçu est affiché ( donc ça marche ) puis il est remplacé par une nouvelle NSImage générée automatiquement.

C'est un peu comme si le drag& drop par defaut du NSImageView fonctionnait comme si de rien n'était.

J'utilise ce code :
@implementation AutoResizeDragAndDropImageView<br /><br />- (id)initWithFrame:(NSRect)frame {<br />&nbsp; &nbsp; self = [super initWithFrame:frame];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Initialization code here.<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br />-(void)awakeFromNib{<br />	//NSLog(@&quot;[DragAndDropImageView] awakeFromNib&quot;);<br />	<br />	[self registerForDraggedTypes:[NSArray arrayWithObjects:NSTIFFPboardType, NSFilenamesPboardType, nil]];<br />	[self setEnabled:NO];<br />	[self setEditable:NO];<br />	<br />}<br /><br />-(void)updateWithResizePicture{<br />	NSImage *sourcePicture = [[NSImage alloc] initWithContentsOfFile: pathToPicture];<br />	NSData* imageTiff = [sourcePicture TIFFRepresentation];<br />	CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)imageTiff,&nbsp; NULL);<br />	CGImageRef imageRefSource = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);<br />	NSSize tailleVignette;<br />	tailleVignette.width = 175;<br />	tailleVignette.height = 100;<br />	<br />	CGImageRef imagerecadree = [PictureResizer resizeThisImage:imageRefSource toThisSize:tailleVignette];<br />	[self setImage:[PictureResizer imageFromCGImageRef:imagerecadree]];<br />	CGImageRelease(imagerecadree);<br />	<br />}<br /><br />#pragma mark dragging operation<br /><br />-(NSDragOperation)draggingEntered:(id &lt;NSDraggingInfo&gt;)sender{<br />	NSLog(@&quot;[DragAndDropImageView] draggingEntered:&quot;);<br />	if ((NSDragOperationCopy &amp; [sender draggingSourceOperationMask]) == NSDragOperationCopy) {<br />		<br />		//[self setNeedsDisplay:YES];<br />		return NSDragOperationCopy;<br />	}else {<br />		return NSDragOperationNone;<br />	}<br />	<br />}<br /><br /><br /><br />-(void)draggingExited:(id &lt;NSDraggingInfo&gt;)sender{<br />	NSLog(@&quot;[DragAndDropImageView] draggingExited:&quot;);<br />	<br />	[self setNeedsDisplay:YES];<br />}<br /><br />-(BOOL)performDragOperation:(id &lt;NSDraggingInfo&gt;)sender{<br />	NSPasteboard *pboard = [sender draggingPasteboard];<br />	<br />	if ([[pboard types] containsObject:NSFilenamesPboardType]) {<br />		NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];<br />		pathToPicture = [NSString stringWithString:[files objectAtIndex:0]];<br />		self.image = nil;<br />		[self updateWithResizePicture];<br />	}<br />	<br />	return YES;<br />}


avez vous une piste a me conseiller ?

Réponses

  • CéroceCéroce Membre, Modérateur
    15:36 modifié #2
    à‰vite en général de sous-classer les classes d'Apple, tu n'as aucune idée de leur fonctionnement interne. Ce fait explique en grande partie pourquoi des classes comme NSWindow ont des délégués.
    (C'est mon expérience personnelle, et chacun a le droit de s'emm*** à  essayer de sous-classer jusqu'à  ce qu'une prochaine version d'OS X casse tout).

    Quelques idées d'alternatives:
    - créer une vue perso par dessus la NSImageView pour intercepter les dépôts.
    - quand on glisse une image, il me semble que son IBAction est exécutée. Pointer l'action sur un objet intermédiaire qui va réduire l'image, modifier le modèle CoreData et changer l'image dans la NSImageView. (<- cette idée-là  est meilleure)
  • pixmanpixman Membre
    septembre 2010 modifié #3
    Hello,
    effectivement, pas besoin de réinventer la roue !

    Pour finir j'ai juste sous classé NSImageView en modifiant cette fonction:
    <br /><br />-(void)setImage:(NSImage *)newImage{<br />	// code de creation de la miniature<br /><br />	[super setImage:maMiniature];<br />}<br />
    


    comme ça je garde le binding et je n'ai pas a modifier le drag and drop.

    ce topic m'a bien aidé : http://pommedev.mediabox.fr/index.php?topic=3188.msg31488#msg31488


Connectez-vous ou Inscrivez-vous pour répondre.