0

我创建了一个应用程序,其中包含一个 ImageView 子类,它直接从 Finder 接受拖放文件/文件夹。

问题是我现在正试图让它接受来自 iPhoto 或 Aperture 的照片。

PboardType我应该注册哪个?

我目前正在做的是:

    [self registerForDraggedTypes:
     [NSArray arrayWithObjects:NSFilenamesPboardType, nil]];

有任何想法吗?

4

2 回答 2

3

使用 Pasteboard Peeker(来自 Apple)向我展示了 Aperture 为您提供文件名/U​​RL 以及“光圈图像数据”(无论是什么)。iPhoto 似乎只给出“ImageDataListPboardType”,这是一个 PLIST。我猜你可以用 NSLog() 来查看它的结构并从中提取图像信息。它可能包括文件名/U​​RL 信息以及作为数据的实际图像。

于 2012-11-02T15:38:41.603 回答
0

您注册 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;
}
于 2013-01-17T01:26:33.693 回答