Пользовательское перетаскивание изображения с NSTableView в качестве источника перетаскивания

Необходимо ли создавать подклассы NSTableView или NSTableCellView для создания настраиваемого изображения перетаскивания, когда tableView является источником перетаскивания?

Если нет, то какой магический метод мне не хватает, чтобы сделать это? Я не могу найти что-то твердое.

ПодклассыNSTableCellView могут (немного загадочно) переопределить:

@property(retain, readonly) NSArray *draggingImageComponents(массив экземпляров NSDraggingImageComponent, которые будут объединены вместе (кто знает, каким образом они составляются...))

СамNSTableView имеет

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

Но это действительно варианты подклассов, кажется.

Кто-нибудь знает другую технику здесь? (Цель 10,8+)

2 ответа

Это выглядит, как если бы 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;};
         }];
    }
}

В вашем источнике данных вы хотите установить изображения, например, из вашего 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];
    }];
Другие вопросы по тегам