2009-10-10 6 views

Répondre

3

Il n'y a aucun moyen de le faire en utilisant uniquement les API de source de glissement.

Si vous regardez Interface Builder, il fait quelque chose de similaire à ce que vous voulez. Lorsque vous faites glisser un bouton hors de la bibliothèque, le bouton s'anime au milieu du glisser.

Selon la plupart des gens, la façon dont Apple fait cela est de faire de l'image glisser une petite image transparente. Ensuite, ils créent une fenêtre et l'ont suivi la souris. Vous pouvez ensuite utiliser la fenêtre pour faire n'importe quel type d'animation que vous voulez.

+5

Au moins de 10.7+ la réponse acceptée est pas plus correct - voir la réponse Иван Георгиев pour la façon actuelle de changer des choses mi-glisser! – cacau

5

Joshua Nozzi a affiché une excellente façon de le faire: http://joshua.nozzi.name/2009/10/jlndrageffectmanager/

+1

Oui. C'est un gestionnaire de drop-in pour cet effet particulier. Le téléchargement contient une application de démonstration. –

+1

Si vous finissez par utiliser cette classe, faites le moi savoir et j'ajouterai votre application à la liste sur la page source. –

4

Jetez un coup d'méthode enumerateDraggingItemsWithOptions de NSDraggingInfo.

+2

S'il vous plaît modifier votre réponse pour élaborer: Comment utiliseriez-vous cette méthode pour résoudre ce problème? –

16

Vous pouvez le faire en utilisant la méthode enumerateDraggingItemsWithOptions: de NSDraggingInfo dans les méthodes de gestionnaire de votre destination de déplacement (c'est-à-dire votre implémentation du protocole NSDraggingDestination).

Par exemple:

- (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; 
            }]; 
} 
Questions connexes