2013-07-11 17 views
5

Ist es notwendig, NSTableView oder NSTableCellView zu erstellen, um ein benutzerdefiniertes Drag-Image zu erstellen, wenn die TableView die Drag-Quelle ist?Benutzerdefiniertes Drag-Image mit NSTableView als Drag-Quelle

Wenn nicht, was ist die magische Methode, die ich vermisse, dies zu tun? Ich kann nichts Festes finden.

NSTableCellView Unterklassen haben kann (etwas geheimnisvoll) Überschreibung:

@property(retain, readonly) NSArray *draggingImageComponents (Array von NSDraggingImageComponent Instanzen, die zusammen gemischt werden erhalten (wer in welcher Art und Weise sie weiß bekommen Compositing ...))

NSTableView selbst hat

- (NSImage *)dragImageForRowsWithIndexes:(NSIndexSet *)dragRows tableColumns:(NSArray *)tableColumns event:(NSEvent *)dragEvent offset:(NSPointPointer)dragImageOffset

Aber das sind in der Tat Unterklassen-Optionen scheint es.

Kennt jemand eine andere Technik hier? (10,8+ ist Ziel)

+0

In weiteren Tests mit NSTableCellView beginnend ersten (Weg des geringsten Widerstandes!) Scheint es, dass, obwohl sie ein Bild zur Verfügung stellen, wird es erst durch die Tabellenansicht und die Tabellenansicht hat einige Seltsamkeit Bilder zu ziehen basierend auf seiner Clip-Ansicht ... Alles, was in der Clip-Ansicht nicht sichtbar ist, wenn das Ziehen beginnt, ist nicht Teil des Drag-Images. – uchuugaka

Antwort

0

In Ihrem data source werden Sie die Bilder z. von Ihrer tableView:draggingSession:willBeginAtPoint:forRowIndexes: Methode, wie so

[session enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationConcurrent 
             forView:tableView 
             classes:[NSArray arrayWithObject:[NSPasteboardItem class]] 
           searchOptions:nil 
            usingBlock:^(NSDraggingItem *draggingItem, NSInteger index, BOOL *stop) 
    { 
     [draggingItem setDraggingFrame:NSMakeRect(0, 0, myWidth, myHeight) 
          contents:myFunkyDragImage]; 
    }]; 
4

Es sieht aus, als ob NSTableViewCell

@property(retain, readonly) NSArray *draggingImageComponents 

nicht automatisch aufgerufen wird erhalten, sondern muss explizit Ansicht basierter Tabellenansichten referenziert werden. -draggingImageComponents kann außer Kraft gesetzt werden, um die Komponenten zu liefern, die zum Zusammensetzen des Ziehbilds verwendet werden.

- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes 
{ 
    // configure the drag image 
    // we are only dragging one item - changes will be required to handle multiple drag items 
    BPPopupButtonTableCellView *cellView = [self.columnsTableView viewAtColumn:0 row:rowIndexes.firstIndex makeIfNecessary:NO]; 
    if (cellView) { 

     [session enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationConcurrent 
              forView:tableView 
              classes:[NSArray arrayWithObject:[NSPasteboardItem class]] 
            searchOptions:nil 
             usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) 
     { 
      // we can set the drag image directly 
      //[draggingItem setDraggingFrame:NSMakeRect(0, 0, myWidth, myHeight) contents:myFunkyDragImage]; 

      // the tableview will grab the entire table cell view bounds as its image by default. 
      // we can override NSTableCellView -draggingImageComponents 
      // which defaults to only including the image and text fields 
      draggingItem.imageComponentsProvider = ^NSArray*(void) { return cellView.draggingImageComponents;}; 
     }]; 
    } 
}