复制图像和文本到UIPasteboard

5
我想要将图片和文本(同时)复制到UIPasteBoard中。 是否可以同时复制文本和图片?

目前我只能复制图片或者文本。 如何同时复制两者?

我的复制图片的代码如下:

UIPasteboard *pasteBoard = [UIPasteboard pasteboardWithName:UIPasteboardNameGeneral create:NO];
pasteBoard.persistent = YES;
NSData *data = UIImagePNGRepresentation(newImage);
[pasteBoard setData:data forPasteboardType:(NSString *)kUTTypePNG]; 

Thanks in advance !!!!!

5个回答

11

以下是我的代码,它在我的设备上运行完美。

UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.persistent = NO;

NSMutableDictionary *text = [NSMutableDictionary dictionaryWithCapacity:1];
[text setValue:captionLabel.text forKey:(NSString *)kUTTypeUTF8PlainText];

NSMutableDictionary *image = [NSMutableDictionary dictionaryWithCapacity:1];
[image setValue:gratitudeImageView.image forKey:(NSString *)kUTTypePNG];

pasteboard.items = [NSArray arrayWithObjects:image,text, nil];

注意!kUTTypeUTF8PlainText和kUTTypePNG需要MobileCoreServices框架支持!或者你可以找到这些确切的字符串并输入进去... - Jonny
提醒2:当尝试发送文本和图像到LINE应用程序时,实际上这并不起作用...可能是因为LINE不支持它。对于我来说,http://media.line.me/howto/en/(格式2)只有图像显示在LINE中。 - Jonny

4
您需要设置粘贴板的 items 属性-
参考文档中对 items 的描述是-
items
粘贴板上的粘贴项。@property(nonatomic,copy) NSArray *items
讨论
该属性的值是字典的数组。每个字典表示一个粘贴板项目,键为表示类型,值为与该类型关联的数据对象或属性列表对象。设置此属性会替换所有当前的粘贴板项目。
因此,您可以将两个带有键值对的字典添加到数组中,并将此数组设置为 items 属性。

谢谢你的回复,Akshay。 - Vijay
这确实是正确的做法。为每个项目创建单独的NSDictionary对象。我已经这样做了,它对我有效。请查看我的答案。 - Shahid Iqbal
从iOS8开始,将文本粘贴到邮件应用程序中不再起作用。如果存在任何图像,则会粘贴它们而不是文本。 - Peter Johnson

3

根据我的经验,在iOS中,官方的方法并不起作用。不要像文档中所述那样为每个项目创建一个单独的字典并将其添加到数组中,而是将所有项目添加到一个单独的字典中,然后使用该单独的字典创建一个数组,并将其设置为剪贴板。

就像这样:

NSMutableDictionary * pasteboardDict = [NSMutableDictionary dictionary];
[pasteboardDict setObject:someData forKey:someUTIkey];
[pasteboardDict setObject:someOtherData forKey:someOtherUTIkey];
[[UIPasteboard generalPasteboard]setItems:[NSArray arrayWithObject:pasteboardDict]];

当我对多个文本对象执行此操作时,似乎在第一个回车符处截断了第一个对象之后的任何文本对象。您是否遇到过这种情况,或者您一直在使用不同类型?http://stackoverflow.com/questions/7444590/uipasteboard-truncating-strings-when-pasting-multiple-items-into-mail?rq=1 - Peter Johnson
感谢ecume des jours的回复。 - Vijay

3
这个问题很久以前就被问过了,但它仍然相关,特别是因为苹果文档没有很清楚地说明Swift多格式UIPasteboard API。在努力找出如何进行多格式复制和粘贴之后,我想分享我的解决方案,以防有人需要。在我的情况下,我需要支持一个内部格式(包含所有详细信息),以及图像和文本版本,以便粘贴到其他应用程序中。
首先,您需要获取UTI常量的访问权限 - 如果不在文件顶部添加此内容,则会得到未解析的符号:
```import MobileCoreServices```
然后定义您的格式UTI:
```let my_private_uti = "com.mydomain.myapp.myformat"```
以下是示例多格式复制的代码(在我的情况下是音乐程序):
externalRepresentation = "[A7]"
internalRepresentation = "A7:0 0 2 0 2 0"
image = UIImage()            
// fill image with chord diagram...

let pasteboard =
    [ [kUTTypeUTF8PlainText as String : externalRepresentation],
      [kUTTypePNG as String: UIImagePNGRepresentation(image!)!],
      [my_private_uti: internalRepresentation]]

    UIPasteboard.general.setItems(pasteboard)

接下来是粘贴板操作。如果我的内部格式可用,我希望能够接受它,并在不可用时处理文本。(请勿在我的情况下使用图形格式。)

//Handle internal format
if let pastedata = UIPasteboard.general.data(forPasteboardType:my_private_uti, inItemSet:nil)  {
    if pastedata.count > 0 {
        if let ourformat = String(data: pastedata[0] as! Data, encoding: .utf8) {
        // Process ourformat string
        print("Pasted internal representation: \(ourformat)")
        return
        }
    }
}

// Handle plain text format 
if let pastedata = UIPasteboard.general.data(forPasteboardType:kUTTypeUTF8PlainText as String, inItemSet:nil) {
if pastedata.count > 0 {
    if let textformat = String(data: pastedata[0] as! Data, encoding: .utf8) {
        // Process normal text
        print("Pasted external representation: \(textformat)")
        return
        }
    }
}

2
似乎在iOS中设置 persistent 布尔值是没有意义的,这是来自Apple的说明:
引用:

iOS的公共(系统)剪贴板是持久的,但默认情况下私有(应用程序)剪贴板不是。当创建它们的应用程序退出时,这些私有剪贴板不会继续存在。但是,您可以将应用程序剪贴板标记为持久。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接