带有动画GIF的NSSharingService?

时间:2014-05-11 21:31:16

标签: objective-c cocoa

我对Objective-C很陌生,但到目前为止,我一直都很了解所有内容。但是,在尝试通过NSSharingService分享动画GIF时,我感到困惑。

我正在附加图片,其中image是一个字符串,其中包含动画GIF的网址(例如http://i.imgur.com/V8w9fKt.gif):

NSImage *imageData = [[NSImage alloc] initWithContentsOfURL:[NSURL URLWithString:image]];
NSArray *shareItems = [NSArray arrayWithObjects:imageData, href, nil];
NSSharingService *service = [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeMessage];
service.delegate = self;
[service performWithItems:shareItems];

然而,当代码运行并且发送消息时,图像将作为PNG文件而不是GIF发送。

我怀疑图像是由NSImage还是NSData展平,我需要先将图像保存到磁盘然后尝试发送。但我想知道,如果没有额外的储蓄步骤就可以实现这一目标。

修改1

我发现GitHub repo试图回答类似的问题。然而,从未找到过解决方案,但最后一点建议是:

  

但是,当我添加带有GIF附件的NSAttributedString时   NSSharingServicePicker,共享图片不会动画。我不能   将包装器RTFD数据添加到选择器,因为它只能共享   支持NSPasteboardWriting协议的对象,RTFD是   以NSData返回。

     

RTFD数据复制到粘贴板NSRTFDPboardType正常工作   保留动画

是否可以将GIF转换为RTDF对象,将其复制到粘贴板,检索粘贴板项目,然后共享该对象?或者用NSSharingService

来保存动画是不可能的

编辑2

正如@Cocoadelica在评论中提到的,我想知道是否需要CoreImage来保存动画。我首先尝试将GIF文件保存到硬盘驱动器,然后将其加载到NSImage,但它再次将其转换为静态PNG。

这非常,非常非常令人沮丧。

1 个答案:

答案 0 :(得分:2)

我最终通过Cocoa-dev邮件列表得到了回复。基本上,您需要附加NSURL直接链接到该文件。它不适用于外部图像,并且永远不会使用NSImage

NSString *fileUrl = @"http://i.imgur.com/V8w9fKt.gif";
NSString *fileName = [fileUrl lastPathComponent];
NSURL *saveUrl = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@", NSTemporaryDirectory()]];
saveUrl = [saveUrl URLByAppendingPathComponent:fileName];
// Write image to temporary directory
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileUrl]];
[data writeToURL:saveUrl atomically:YES];

// Attach the raw NSURL pointing to the local file
NSArray *shareItems = [NSArray arrayWithObjects:saveUrl, @"Text", nil];

// Open share prompt
NSSharingService *service = [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeMessage];
service.delegate = self;
[service performWithItems:shareItems];

然后我实现了didShareItems和didFailToShareItems,以便在共享完成后删除文件:

- (void)sharingService:(NSSharingService *)sharingService didShareItems:(NSArray *)items{
    NSString *path = items[0];
    [self removeFile:path];
}

...

- (void)removeFile:(NSString *)path{
    [[NSFileManager defaultManager] removeItemAtPath:path error:NULL];
}

对于那些苦苦挣扎的人,我发现一切都需要以下方法才能正常工作:

- (NSWindow *)sharingService:(NSSharingService *)sharingService sourceWindowForShareItems:(NSArray *)items sharingContentScope:(NSSharingContentScope *)sharingContentScope{
    return self.window;
}

我意识到某些代码是不正确的(我的URLWithString创建是违反直觉的,但我正在学习),但这应该让那些努力成为起点。