Objective-C:将图像从文件复制到设备粘贴板

Posted

技术标签:

【中文标题】Objective-C:将图像从文件复制到设备粘贴板【英文标题】:Objective-C: Copy images from file to device pasteboard 【发布时间】:2014-08-12 15:00:48 【问题描述】:

我有一个图像文件 (.png) 保存到应用程序的文档目录中,我希望用户能够将其复制到设备粘贴板上。此处的目标是允许他们在复制图像并将其粘贴到应用程序之外的某个位置(例如短信或电子邮件)后离开应用程序。

这是我尝试将图像复制到 UIPasteboard 的内容:

NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *path = [docsDirectory stringByAppendingPathComponent:@"testscreen.png"];

NSData *data = [NSData dataWithContentsOfFile:convertedFilePath];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.persistent = true;
[pasteBoard setData:data forPasteboardType:@"public.png"];

我也尝试了一些变体,例如如下设置“图像”属性:

UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.image = <someImg>

但是,当我离开应用程序并尝试将我复制的内容粘贴到应用程序之外时,就好像我根本没有将任何内容复制到剪贴板,而是粘贴了我之前复制的内容。

如果我想允许用户将图像复制到剪贴板,然后离开我的应用程序并通过文本或电子邮件粘贴这些图像,UIPasteboard 是处理此问题的正确方法吗?我在另一个名为SMS Rage Faces 的应用程序中看到了这种类型的行为,所以我知道它可以访问剪贴板并将图像复制到其中,然后用户可以将其粘贴到他们喜欢的任何位置 - 但我的图像似乎从未正确复制到剪贴板,或者它们不会保留在我的应用程序之外。

【问题讨论】:

【参考方案1】:

问题是您在 setData:forPasteboardType: 方法中传递了错误的类型

您必须传递一个 UTI,您可以从您的文件扩展名中获取它(假设扩展名与实际文件类型匹配)。 做这样的事情:

UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];

CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)@"png", NULL);

[pasteboard setData:[NSData dataWithContentsOfFile:yourData] forPasteboardType:(__bridge NSString *)uti];

if (uti)
    CFRelease(uti);

【讨论】:

感谢您的建议,我尝试了这个并且能够编译但仍然看到与上述相同的问题。仔细检查一下,'setData:[NSData dataWithContentsOfFile:yourData]' 中的 yourData 参数应该仍然指向我的文件路径,对吗?我已确认设备上保存的文件名为“testscreen.png”,并使用DiskAid 将其保存在 Documents 目录中,以确保它正确存在。 我从 AppStore 上的一个应用程序中复制/粘贴了代码,例如,可以复制 png 图像然后粘贴到“消息”中。你确定你的 NSData 没问题并且不为空吗? 你的数据应该是 NSData *yourData = [NSData dataWithContentsOfFile:convertedFilePath]; 我是否只需要像这样传递 yourData:[pasteboard setData:yourData ...]?如上所述声明 NSData *yourData 并在 [pasteboard setData:...] 中传递它会导致问题,因为 dataWithContentsOfFile 需要一个 NSString 但我正在传递 NSData ,除非我遗漏了什么。我将尝试在我的 NSData 上获取一些调试信息并确认这是否有效(我在更新到 ios 7.1.2 后从我的设备中提取 NSLog() 数据时遇到了问题,所以不幸的是我无法确认事情是否正确设置正确与否)。 dataWithContentsOfFile: 需要一个带有文件路径的 NSString,而不是 NSData。出于这个原因,我认为您的 NSData 变量为零。在模拟器或设备上检查非常简单,使用一个断点和调试器(或者只是 XCode 中的变量检查器)

以上是关于Objective-C:将图像从文件复制到设备粘贴板的主要内容,如果未能解决你的问题,请参考以下文章

使用Objective-c中的进度条将文件从一个地方复制到另一个地方[重复]

使用 Objective-C 将图像下载到 iPad

将范围复制为图像并粘贴到 Outlook 中(结果小/模糊)

如何使用 Konva.js 将图像复制/粘贴到另一个图像?

为啥当我将文本从浏览器复制并粘贴到文件时,Vim 会再次缩进每一行?

测试特定图像是不是已复制到粘贴板