2009-10-10 18 views

risposta

3

Non c'è modo di farlo utilizzando solo le API di trascinamento.

Se guardi a Interface Builder fa qualcosa di simile a quello che vuoi. Quando trascini un pulsante fuori dalla libreria, il pulsante si anima nel mezzo del trascinamento.

Secondo la maggior parte delle persone il modo in cui Apple sta facendo ciò è rendere l'immagine di trascinamento un'immagine piccola e trasparente. Quindi creano una finestra e fanno seguire il mouse. È quindi possibile utilizzare la finestra per eseguire qualsiasi tipo di animazione desiderata.

+5

Almeno a partire dal 10.7 e versioni successive la risposta accettato non è più corretta - vedere Иван Георгиев risposta per l'attuale modo di cambiare roba metà trascinare! – cacau

5

Joshua Nozzi ha pubblicato un ottimo modo per fare questo: http://joshua.nozzi.name/2009/10/jlndrageffectmanager/

+1

Sì. Questo è un gestore drop-in per questo particolare effetto. Il download contiene un'app demo. –

+1

Se si finisce con l'uso di questa classe, fammelo sapere e aggiungerò la tua app alla lista sulla pagina di origine. –

4

Partenza metodo enumerateDraggingItemsWithOptions di NSDraggingInfo.

+2

Per favore modifica la tua risposta per elaborare: come utilizzeresti questo metodo per risolvere questo problema? –

16

È possibile farlo utilizzando il metodo enumerateDraggingItemsWithOptions: di NSDraggingInfo nei metodi del gestore di destinazione di trascinamento (ad esempio, l'implementazione del protocollo NSDraggingDestination).

Ad esempio:

- (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; 
            }]; 
} 
Problemi correlati