Sai quell'effetto quando trascini un oggetto dal dock e quel cursore di trascinamento della nuvola appare e quando lo lasci andare scompare con un effetto poof? Allo stesso modo, in Xcode quando si trascina un punto di interruzione al di fuori del numero di linea, si verifica lo stesso errore.Trascina per eliminare l'elemento
Vorrei implementare lo stesso effetto nella mia applicazione ma non trovo la strada giusta.
Ho un discendente NSImageView per implementare i protocolli NSDraggingSource e NSDraggingDestination. Ho diverse istanze di questa vista che consentono di trascinare il loro contenuto tra gli altri (un'operazione di copia si svolge in questo scenario, ma questo è rilevante solo per mostrare che ho drag'n drop impiantato e pienamente funzionante per le attività standard).
Ora, quando trascino un'immagine dalla sua vista in qualsiasi posizione (eccetto un'altra istanza di vista) Voglio che l'operazione di cancellazione abbia luogo in caduta. Tuttavia, l'operazione di trascinamento è completamente controllata dalla vista di destinazione. Potrei riuscire a farli rispondere nel modo che voglio (anche se questo sarebbe un sacco di lavoro), ma fallisce completamente se sto trascinando fuori dalla mia applicazione.
Se ho potuto ottenere l'operazione di eliminazione di trascinamento ho potuto gestire questo però problemi dalla:
- (void)draggedImage: (NSImage *)image
endedAt: (NSPoint)screenPoint
operation: (NSDragOperation)operation
{
if (operation == NSDragOperationDelete) {
NSRect rect = [self.window convertRectToScreen: [self convertRect: self.frame fromView: nil]];
NSShowAnimationEffect(NSAnimationEffectPoof, rect.origin, self.bounds.size, nil, nil, NULL);
}
}
Ho provato già per impostare il cursore di eliminazione simili:
- (void)draggingSession: (NSDraggingSession *)session
movedToPoint: (NSPoint)screenPoint
{
if (!NSPointInRect(screenPoint, self.window.frame)) {
[[NSCursor disappearingItemCursor] set];
}
}
(per semplicità questo è per l'intera windw al momento). Questo funziona fintanto che non colpisco il desktop o una finestra di ricerca. In inizia a sfarfallare, probabilmente perché il Finder imposta contemporaneamente il proprio cursore di trascinamento. Non ha alcun effetto quando colpisco il molo. Questo accade anche quando definisco il mio tipo di dati a scacchiera.
Inoltre, qualsiasi altra visualizzazione abilitata per il rilascio nella mia applicazione accetterà ancora i miei dati di trascinamento (ad esempio NSTextView) che non voglio che accada (sto scrivendo un NSURL al pannello di trascinamento con uno schema personalizzato).
Aggiornamento:
Sono venuto inoltre a pochi passi. Come Peter già indicato, è essenziale per gestire draggingSession:sourceOperationmaskForDraggingContext:
che sembra così nel mio codice:
- (NSDragOperation) draggingSession: (NSDraggingSession *)session
sourceOperationMaskForDraggingContext: (NSDraggingContext)context;
{
switch(context) {
case NSDraggingContextOutsideApplication:
return NSDragOperationDelete;
break;
case NSDraggingContextWithinApplication:
default:
return NSDragOperationDelete | NSDragOperationMove;
break;
}
}
Questo risolve 2 problemi: 1) fuori dell'applicazione l'operazione di trascinamento non è accettata a tutti, 2) Mantiene tutte le viste standard dall'accettare anche questa operazione (poiché NSOutlineView, NSTextView ecc. non gestiscono le operazioni di trascinamento fornite). Inoltre, ho creato un proprio tipo di datasheet, ma questo non sembra essere necessario. Eppure è più chiaro avere una propria.
Sfortunatamente, l'uscita dal mio discendente NSImageView (sia all'interno che all'esterno dell'applicazione) non mi dà NSDragOperationDelete in draggedImage:endedAt:operation:
(cosa ho specificato sopra) ma NSDragOperationNone. Inoltre il cursore di trascinamento quando si sposta il mouse all'esterno dell'applicazione è quello non consentito, non quello che scompare. Quindi, se qualcuno potesse risolvere queste due cose, lo accetterei come risposta alla mia domanda.
Si prega di modificare la domanda per mostrare l'implementazione del metodo di trascinamento del 'draggingSession: sourceOperationMaskForDraggingContext:'. –