当tableView是拖动源时,是否需要子类化NSTableView或NSTableCellView来创建自定义拖动图像?
如果没有,我缺少的神奇方法是什么?我似乎找不到任何可靠的东西。
NSTableCellView 子类可以(略微神秘地)覆盖:
@property(retain, readonly) NSArray *draggingImageComponents
( NSDraggingImageComponent 实例的数组将合成在一起(谁知道它们以何种方式合成...)
NSTableView 本身有
- (NSImage *)dragImageForRowsWithIndexes:(NSIndexSet *)dragRows tableColumns:(NSArray *)tableColumns event:(NSEvent *)dragEvent offset:(NSPointPointer)dragImageOffset
但这些确实是子类化选项。
有人知道另一种技术吗? (10.8+是目标)
答案 0 :(得分: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;};
}];
}
}
答案 1 :(得分:1)
在您的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];
}];