2013-07-11 89 views
5

當tableView是拖動源時,是否需要繼承NSTableView或NSTableCellView以創建自定義拖動圖像?以NSTableView作爲拖動源的自定義拖動圖像

如果不是,我錯過了什麼神奇的方法來做到這一點?我似乎無法找到任何堅實的東西。

NSTableCellView子類有能(略神祕)覆蓋:

@property(retain, readonly) NSArray *draggingImageComponents (陣列NSDraggingImageComponent的情況下,將獲得複合在一起(誰在他們得到合成什麼方式知道...))

NSTableView的本身具有

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

但這些確實是它看起來的子類化選項。

有人知道另一種技術嗎? (10.8+是目標)

+0

在進一步的測試開始NSTableCellView第一(路徑阻力最小!)似乎是,雖然它們提供的圖像時,它首先經過表視圖,和表視圖確實一些古怪基於拖動圖像其剪輯視圖...當開始拖動時剪輯視圖中不可見的任何內容不是拖動圖像的一部分。 – uchuugaka

回答

0

在您的data source中,您需要設置圖像,例如從tableView:draggingSession:willBeginAtPoint:forRowIndexes:方法,像這樣

[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

看起來好像NSTableViewCell

@property(retain, readonly) NSArray *draggingImageComponents 

不會被自動調用,但必須查看基於表視圖中明確提到。可以覆蓋-draggingImageComponents以提供用於組合拖動圖像的組件。

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