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 Answers
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;
}];
}

- 1,146
- 12
- 20
Joshua Nozzi has posted a great way to do this: http://joshua.nozzi.name/2009/10/jlndrageffectmanager/

- 85,404
- 22
- 176
- 172
-
1Yep. This is a drop-in manager for this particular effect. The download contains a demo app. – Joshua Nozzi Dec 14 '09 at 03:23
-
1If you end up using this class, just let me know and I'll add your app to the list on the source page. – Joshua Nozzi Jul 05 '10 at 18:53
-
The link is dead. – Willeke Jul 26 '22 at 21:25
Check out NSDraggingInfo's enumerateDraggingItemsWithOptions method.

- 1,212
- 13
- 15
-
3Please edit your answer to elaborate: How would you use that method to solve this problem? – Peter Hosey Sep 01 '12 at 02:17
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.

- 830
- 4
- 6
-
6At least as of 10.7+ the accepted response is no longer correct - see Иван Георгиев answer for the current way to change stuff mid-drag! – cacau Feb 19 '14 at 07:15