[Résolu] Modifier la gestion du DragAndDrop d'une NSImageView
pixman
Membre
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 :
avez vous une piste a me conseiller ?
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 /> self = [super initWithFrame:frame];<br /> if (self) {<br /> // Initialization code here.<br /> }<br /> return self;<br />}<br /><br />-(void)awakeFromNib{<br /> //NSLog(@"[DragAndDropImageView] awakeFromNib");<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, 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 <NSDraggingInfo>)sender{<br /> NSLog(@"[DragAndDropImageView] draggingEntered:");<br /> if ((NSDragOperationCopy & [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 <NSDraggingInfo>)sender{<br /> NSLog(@"[DragAndDropImageView] draggingExited:");<br /> <br /> [self setNeedsDisplay:YES];<br />}<br /><br />-(BOOL)performDragOperation:(id <NSDraggingInfo>)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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
(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)
effectivement, pas besoin de réinventer la roue !
Pour finir j'ai juste sous classé NSImageView en modifiant cette fonction:
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