Dlatego chcę przeciągnąć obiekt z jednego źródła do wielu potencjalnych miejsc docelowych. Kiedy obiekt znajduje się nad każdym miejscem docelowym, chcę, aby przekształcił się w inny obraz. Czy istnieje prosty sposób na zrobienie tego z perspektywy NSDragSource?Jak zmienić przeciągnięcie i upuszczenie obrazu w połowie przeciągnięcia?
Odpowiedz
Nie można tego zrobić, korzystając tylko z interfejsów API źródeł drag.
Jeśli spojrzysz na Interface Builder, robi to coś, co chcesz. Po przeciągnięciu przycisku z biblioteki przycisk uruchamia się w środku przeciągania.
Według większości ludzi sposób, w jaki robi to firma Apple, polega na tym, że obraz przeciągania staje się małym przezroczystym obrazem. Następnie tworzą okno i każą podążać za myszą. Następnie możesz użyć tego okna do wykonania dowolnego rodzaju animacji.
Joshua Nozzi opublikował świetny sposób, aby to zrobić: http://joshua.nozzi.name/2009/10/jlndrageffectmanager/
Tak. To jest menedżer kropli dla tego konkretnego efektu. Pobieranie zawiera aplikację demonstracyjną. –
Jeśli skończysz używać tej klasy, daj mi znać, a dodam ją do listy na stronie źródłowej. –
Check out enumerateDraggingItemsWithOptions metodę NSDraggingInfo użytkownika.
Edytuj swoją odpowiedź, aby rozwinąć: W jaki sposób użyjesz tej metody, aby rozwiązać ten problem? –
Można to zrobić za pomocą metody enumerateDraggingItemsWithOptions:
z NSDraggingInfo
w metodach obsługi przeciągania miejsca docelowego (np. - implementacja protokołu NSDraggingDestination
).
Na przykład:
- (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;
}];
}
Przynajmniej jak z 10.7+ przyjętą odpowiedź nie jest prawidłowa - patrz Иван Георгиев odpowiedź dla obecnego sposobu, aby zmienić rzeczy w połowie przeciągnij! – cacau