2013-07-11 3 views
5

Нужно ли подклассы NSTableView или NSTableCellView создавать пользовательское изображение перетаскивания, когда tableView является источником перетаскивания?Пользовательское изображение перетаскивания с 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;}; 
     }]; 
    } 
} 
Смежные вопросы