lar*_*rod 2 macos cocoa objective-c nstableview
我已经用头撞墙大约两周了,我查看了所有可用的 Apple 文档以及数百个网站,寻找解决我的问题的提示。我正在实施:
-(void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是拖动文件的图标显示在不同的坐标系中,并且我似乎无法找到一种方法使图标显示在拖动开始的屏幕点上。我已经研究了几种组合中的所有 [tableView Convert* ] 方法,但没有成功。下面是我当前正在使用的代码。
-(void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes {
[session enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationConcurrent
forView:tableView
classes:[NSArray arrayWithObjects:[NSPasteboardItem class], nil]
searchOptions:nil
usingBlock:^(NSDraggingItem *draggingItem, NSInteger index, BOOL *stop)
{
NSMutableArray *videos = [NSMutableArray array];
for (Video* video in [_arrayController selectedObjects]) {
[videos addObject:video.url];
}
NSImage *draggedImage = [[NSWorkspace sharedWorkspace]iconForFiles:videos];
NSPoint mouseLocInView = [tableView convertPoint:[tableView.window convertRectFromScreen:NSMakeRect(screenPoint.x,screenPoint.y, 0, 0)].origin fromView:nil];
NSLog(@"Mouse location in view: X: %f, Y: %f",mouseLocInView.x, mouseLocInView.y);
NSLog(@"Screen point: X: %f, Y:%f", screenPoint.x, screenPoint.y);
NSRect rect = NSMakeRect(0, 0, 50, 50);
rect.origin =draggingItem.draggingFrame.origin;
[draggingItem setDraggingFrame:rect contents:draggedImage];
session.draggingFormation = NSDraggingFormationDefault;
}];}
Run Code Online (Sandbox Code Playgroud)
在仔细阅读文档后我终于明白了。
for - enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock: 的文档表示“forView:”参数是传递的每个 NSDraggingItem 的坐标系应基于的视图。为屏幕坐标系传递 nil。
非常令人困惑的是,我通过在draggingItem上记录draggingFrame进行调试,但无法弄清楚它是什么框架。好吧,里面有什么并不重要,如果你传递 nil 作为视图,你可以将拖动框架设置为基于屏幕的坐标,就像调用 session.draggingLocation 时得到的一样。
#define DRAG_IMAGE_WIDTH 48
#define DRAG_IMAGE_HEIGHT 48
- (void)tableView:(NSTableView *)tableView
draggingSession:(NSDraggingSession *)session
willBeginAtPoint:(NSPoint)screenPoint
forRowIndexes:(NSIndexSet *)rowIndexes {
NSImage *image = [NSImage imageNamed:@"tunnelfile"];
[session enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationConcurrent
forView:nil
classes:[NSArray arrayWithObject:[NSPasteboardItem class]]
searchOptions:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:NSPasteboardURLReadingFileURLsOnlyKey ]
usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop)
{
[draggingItem setDraggingFrame:NSMakeRect(session.draggingLocation.x-20,
session.draggingLocation.y-DRAG_IMAGE_HEIGHT+20,
DRAG_IMAGE_WIDTH,
DRAG_IMAGE_HEIGHT)
contents:image];
}];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
783 次 |
| 最近记录: |