Como você muda uma imagem de arrastar e soltar no meio do drag?
-
20-09-2019 - |
Pergunta
Então, eu quero arrastar um objeto de uma fonte para vários destinos em potencial. Quando o objeto está acima de cada destino, eu quero que ele 'se transforme' em uma imagem diferente. Existe uma maneira direta de fazer isso na perspectiva do NSDRAGSource?
Solução
Não há como fazer isso usando apenas as APIs da fonte de arrasto.
Se você olhar para o Builder da Interface, ele faz algo semelhante ao que você deseja. Quando você arrasta um botão para fora da biblioteca, o botão anima no meio do arrasto.
De acordo com a maioria das pessoas, a maneira como a Apple está fazendo isso é tornando a imagem de arrasto uma pequena imagem transparente. Em seguida, eles criam uma janela e seguem o mouse. Você pode usar a janela para fazer qualquer tipo de animação que desejar.
Outras dicas
Você pode fazer isso usando enumerateDraggingItemsWithOptions:
método de NSDraggingInfo
nos métodos de manipulador do seu destino de arrastar (ou seja - sua implementação de NSDraggingDestination
protocolo).
Por exemplo:
- (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;
}];
}
Joshua Nozzi postou uma ótima maneira de fazer isso: http://Joshua.nozzi.name/2009/10/jlndrageffettmanager/
Confira o método enumerado de NsdraggingInfo.