2009-10-10 5 views

Antwort

3

Es gibt keine Möglichkeit, dies nur mit den Drag-Source-APIs zu tun.

Wenn Sie sich den Interface Builder anschauen, wird etwas Ähnliches wie gewünscht ausgeführt. Wenn Sie eine Schaltfläche aus der Bibliothek ziehen, wird die Schaltfläche in der Mitte des Ziehens animiert.

Nach den meisten Menschen ist die Art, wie Apple dies tut, indem Sie das Ziehbild ein kleines transparentes Bild machen. Dann erstellen sie ein Fenster und lassen es der Maus folgen. Sie können dann das Fenster verwenden, um jede gewünschte Art von Animation auszuführen.

+5

Mindestens ab 10.7+ die akzeptierte Antwort ist nicht mehr richtig - Иван Георгиев Antwort für die aktuelle Art und Weise sehen zu stopfen Mitte ziehen zu ändern! – cacau

5

Joshua Nozzi hat eine große Weise geschrieben, dies zu tun: http://joshua.nozzi.name/2009/10/jlndrageffectmanager/

+1

Ja. Dies ist ein Drop-In-Manager für diesen bestimmten Effekt. Der Download enthält eine Demo-App. –

+1

Wenn Sie diese Klasse verwenden, lassen Sie es mich wissen und ich füge Ihre App der Liste auf der Quellseite hinzu. –

4

Check out enumerateDraggingItemsWithOptions Methode des NSDraggingInfo.

+2

Bitte bearbeiten Sie Ihre Antwort, um zu erläutern: Wie würden Sie diese Methode verwenden, um dieses Problem zu lösen? –

16

Sie können dies tun, indem Sie die Methode enumerateDraggingItemsWithOptions: Methode NSDraggingInfo in den Handler-Methoden Ihres Ziehvorgangs verwenden (d. H. - Ihre Implementierung des Protokolls NSDraggingDestination).

Zum Beispiel:

- (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; 
            }]; 
} 
Verwandte Themen