2013-07-11 14 views
5

È necessario creare sottoclassi NSTableView o NSTableCellView per creare un'immagine di trascinamento personalizzata quando TableView è la sorgente di trascinamento?Immagine di trascinamento personalizzata con NSTableView come sorgente di trascinamento

In caso contrario, qual è il metodo magico che mi manca per fare questo? Non riesco a trovare nulla di solido.

NSTableCellView sottoclassi hanno può (un po 'misteriosamente) Azionamento:

@property(retain, readonly) NSArray *draggingImageComponents (serie di NSDraggingImageComponent istanze che andranno mescolati insieme (chissà in che modo essi ottenere mescolati ...))

NSTableView stessa ha

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

Ma queste sono davvero opzioni di sottoclassi a quanto pare.

Qualcuno conosce un'altra tecnica qui? (10,8+ è target)

+0

In ulteriori prove iniziano NSTableCellView primo (percorso di minima resistenza!) Sembra che anche se essi forniscono un'immagine, passa prima attraverso la vista tabella, e la vista tabella non alcune stranezze trascinare immagini in base alla sua Vista clip ... tutto ciò che non è visibile nella vista clip quando il trascinamento ha inizio non fa parte dell'immagine di trascinamento. – uchuugaka

risposta

0

Nel tuo data source ti consigliamo di impostare le immagini ad es. dal tuo metodo tableView:draggingSession:willBeginAtPoint:forRowIndexes: in questo modo

[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

Sembra come se NSTableViewCell

@property(retain, readonly) NSArray *draggingImageComponents 

non viene chiamato automaticamente ma deve essere esplicitamente fatto riferimento per le viste di tabella Based View. -draggingImageComponents può essere sovrascritto per fornire i componenti utilizzati per comporre l'immagine di trascinamento.

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