How do you change a drag-and-dropped image mid-drag?

2.5k Views Asked by At

So I want to drag an object from one source to multiple potential destinations. When the object is over each destination, I want it to 'morph' into a different image. Is there a straightforward way to do this from the NSDragSource perspective?

4

There are 4 best solutions below

1
On BEST ANSWER

There's no way to do this using just the drag source APIs.

If you look at Interface Builder it does something similar to what you want. When you drag a button out of the library the button animates in the middle of the drag.

According to most people the way Apple is doing this is by making the drag image a small transparent image. Then they create a Window and have it follow the mouse. You can then use the window to do any type of animation you want.

3
On

Joshua Nozzi has posted a great way to do this: http://joshua.nozzi.name/2009/10/jlndrageffectmanager/

1
On

Check out NSDraggingInfo's enumerateDraggingItemsWithOptions method.

0
On

You can do so by using enumerateDraggingItemsWithOptions: method of NSDraggingInfo in your dragging destination's handler methods (i.e. - your implementation of NSDraggingDestination protocol).

For example:

- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender
{
    NSImage* newDragImage = <take it from wherever>;
    [sender enumerateDraggingItemsWithOptions:0
                                      forView:sender.draggingSource
                                      classes:[NSArray arrayWithObject:[NSPasteboardItem class]]
                                searchOptions:nil
                                   usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) {
                                       NSRect theFrame = draggingItem.draggingFrame;
                                       theFrame.size = newDragImage.size;
                                       [draggingItem setDraggingFrame:theFrame contents:newDragImage];
                                       *stop = NO;
                                   }];
}