我创建了一个应用程序,其中包含一个 ImageView 子类,它直接从 Finder 接受拖放文件/文件夹。
问题是我现在正试图让它接受来自 iPhoto 或 Aperture 的照片。
PboardType
我应该注册哪个?
我目前正在做的是:
[self registerForDraggedTypes:
[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
有任何想法吗?
我创建了一个应用程序,其中包含一个 ImageView 子类,它直接从 Finder 接受拖放文件/文件夹。
问题是我现在正试图让它接受来自 iPhoto 或 Aperture 的照片。
PboardType
我应该注册哪个?
我目前正在做的是:
[self registerForDraggedTypes:
[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
有任何想法吗?
使用 Pasteboard Peeker(来自 Apple)向我展示了 Aperture 为您提供文件名/URL 以及“光圈图像数据”(无论是什么)。iPhoto 似乎只给出“ImageDataListPboardType”,这是一个 PLIST。我猜你可以用 NSLog() 来查看它的结构并从中提取图像信息。它可能包括文件名/URL 信息以及作为数据的实际图像。
您注册 NSFilenamesPboardType 是正确的。完成任务:
1:确保在draggingEntered中接受复制操作。通用操作是不够的。
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
NSPasteboard *pasteboard = [sender draggingPasteboard];
if ( [[pasteboard types] containsObject:NSFilenamesPboardType] ) {
if (sourceDragMask & NSDragOperationCopy) {
return NSDragOperationCopy;
}
}
return NSDragOperationNone;
}
2:每张照片将有一个文件名。和他们做点什么。
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
NSPasteboard *pasteboard;
NSDragOperation sourceDragMask;
sourceDragMask = [sender draggingSourceOperationMask];
pasteboard = [sender draggingPasteboard];
if ([[pasteboard types] containsObject:NSFilenamesPboardType])
{
NSData* data = [pasteboard dataForType:NSFilenamesPboardType];
if(data)
{
NSString *errorDescription;
NSArray *filenames = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:kCFPropertyListImmutable format:nil errorDescription:&errorDescription];
for (NSString* filename in filenames)
{
NSImage* image = [[NSImage alloc]initWithContentsOfFile:filename];
//Do something with the image
}
}
}
return YES;
}