我是Objective-C的新手,但到目前为止,我一直都很了解一切.但是,我试图通过NSSharingService分享动画GIF.
我正在附加图像,其中image是一个包含动画GIF的URL的字符串(例如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.然而,从未找到解决方案,但最后一点建议是:
However, when I add an
NSAttributedString
with a GIF attachment to
NSSharingServicePicker
, the shared image is not animated. I can’t
add the wrapperRTFD
data to the picker, as it can only share
objects that supportNSPasteboardWriting
protocol, and theRTFD
is
returned asNSData
.Copying
RTFD
data to pasteboard asNSRTFDPboardType
works and
preserves animation
是否可以将GIF转换为RTDF对象,将其复制到粘贴板,检索粘贴板项目,然后共享该对象?或者使用NSSharingService保留动画是不可能的?
编辑2:
正如@Cocoadelica在评论中提到的,我想知道是否需要CoreImage来保存动画.我首先尝试将GIF文件保存到硬盘驱动器,然后将其加载到NSImage中,但它再次将其转换为静态PNG.
这非常,非常非常令人沮丧.
最佳答案 我最终通过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创建是违反直觉的,但我正在学习),但这应该让那些努力成为起点.