在 NSTableView 中使用第一列拖动图像
Use first column for drag image in NSTableView
我在 table 视图中实现拖放,我遇到的问题是拖动图像总是基于拖动开始的列,但我想使用第一列中的图像。
我查看了 Apple 的 TableViewPlayground 示例,其中 "Complex OutlineView Window" 可以满足我的要求,但我无法弄清楚我在设置拖动方面所做的不同之处。
我在 https://github.com/Uncommon/TableTest 中整理了一个简单的示例 - 如果您从第二列 "stuff" 处拖动,那么看起来您正在拖动单词 "stuff"。我想要的是让拖动图像始终来自第一列(带有图标和名称),无论您从哪一列拖动。
在我的数据源中,我实现了 tableView(tableView:,pasteboardWriterForRow:)
以启用拖动,但这不包括有关拖动从哪一列开始的信息。我从示例应用程序中缺少什么来使这项工作正常进行?
NSTableView
拖动开始拖动的列,NSOutlineView
拖动轮廓列。如果要更改图像,子类 NSTableView
并覆盖 dragImageForRows(with:tableColumns:event:offset:)
.
已接受的答案对我不起作用。相反,我必须在 NSTableViewDataSource
中实现以下可选函数:
func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
// Or whatever cell you want as the drag image
let cell = tableView.view(atColumn: 0, row: rowIndexes.first!, makeIfNecessary: false) as? NSTableCellView
session.enumerateDraggingItems(options: .concurrent, for: nil, classes: [NSPasteboardItem.self], searchOptions: [:]) {(draggingItem, idx, stop) in
if let cell = cell {
let rect = cell.bounds
let drag = session.draggingLocation
// You can customize the image starting point and size here
draggingItem.setDraggingFrame(NSRect(x: drag.x, y: drag.y, width: rect.width, height: rect.height), contents: cell.draggingImageComponents)
draggingItem.imageComponentsProvider = {
return cell.draggingImageComponents
}
}
}
}
感谢 this answer 提供了大部分解决方案。
回应原因
dragImageForRows(with:tableColumns:event:offset:)
无效:
Note:
To support multi-item drags, it is highly recommended to implement the delegate method tableView:pasteboardWriterForRow: instead. Using that method will cause this method to not be called.
我在 table 视图中实现拖放,我遇到的问题是拖动图像总是基于拖动开始的列,但我想使用第一列中的图像。
我查看了 Apple 的 TableViewPlayground 示例,其中 "Complex OutlineView Window" 可以满足我的要求,但我无法弄清楚我在设置拖动方面所做的不同之处。
我在 https://github.com/Uncommon/TableTest 中整理了一个简单的示例 - 如果您从第二列 "stuff" 处拖动,那么看起来您正在拖动单词 "stuff"。我想要的是让拖动图像始终来自第一列(带有图标和名称),无论您从哪一列拖动。
在我的数据源中,我实现了 tableView(tableView:,pasteboardWriterForRow:)
以启用拖动,但这不包括有关拖动从哪一列开始的信息。我从示例应用程序中缺少什么来使这项工作正常进行?
NSTableView
拖动开始拖动的列,NSOutlineView
拖动轮廓列。如果要更改图像,子类 NSTableView
并覆盖 dragImageForRows(with:tableColumns:event:offset:)
.
已接受的答案对我不起作用。相反,我必须在 NSTableViewDataSource
中实现以下可选函数:
func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
// Or whatever cell you want as the drag image
let cell = tableView.view(atColumn: 0, row: rowIndexes.first!, makeIfNecessary: false) as? NSTableCellView
session.enumerateDraggingItems(options: .concurrent, for: nil, classes: [NSPasteboardItem.self], searchOptions: [:]) {(draggingItem, idx, stop) in
if let cell = cell {
let rect = cell.bounds
let drag = session.draggingLocation
// You can customize the image starting point and size here
draggingItem.setDraggingFrame(NSRect(x: drag.x, y: drag.y, width: rect.width, height: rect.height), contents: cell.draggingImageComponents)
draggingItem.imageComponentsProvider = {
return cell.draggingImageComponents
}
}
}
}
感谢 this answer 提供了大部分解决方案。
回应原因
dragImageForRows(with:tableColumns:event:offset:)
无效:
Note: To support multi-item drags, it is highly recommended to implement the delegate method tableView:pasteboardWriterForRow: instead. Using that method will cause this method to not be called.