Пользовательское перетаскивание изображения с 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];
}];