将图像和文本复制到UIPasteboard

时间:2011-10-05 07:57:26

标签: iphone uipasteboard

我想将图片和文字(两者)复制到UIPasteBoard。 是否可以同时复制文字和图片。

在这里,我只能复制图像或仅复制文本。 如何复制两者?

我的复制图像代码如下,

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

提前致谢!!!!!

5 个答案:

答案 0 :(得分: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];

答案 1 :(得分:3)

您应该设置粘贴板的items属性 -

参考文献中的项目描述是 -

  

     

粘贴板上的粘贴板项目。 @属性(非原子,副本)   NSArray *项目讨论

     

属性的值是一个字典数组。每本字典   表示粘贴板项目,键是表示   类型和数据对象或属性列表对象关联的值   那种类型。设置此属性将替换所有当前属性   粘贴板物品。

因此,您可以向数组中添加两个词典,键值对为&并将此数组设置为items属性。

答案 2 :(得分:2)

根据我的经验,官方方式根本不适用于iOS。不是为每个项目创建单独的字典并将其添加到数组中(如文档中所述),而是将所有项目添加到单个字典中,然后使用该单个字典创建一个数组并将其设置为粘贴板。

像这样:

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

答案 3 :(得分:2)

似乎在Apple中设置persistent布尔值毫无意义,来自Apple:

  

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

答案 4 :(得分:2)

这个问题是很久以前问的,但它仍然很重要-特别是因为Apple文档没有使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
        }
    }
}