【问题标题】:copy image and text to the UIPasteboard将图像和文本复制到 UIPasteboard
【发布时间】:2011-12-01 06:42:54
【问题描述】:

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

这里我可以只复制图片或只复制文字。 如何复制两者?

我的复制图片代码如下,

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

提前谢谢!!!!!!

【问题讨论】:

    标签: iphone uipasteboard


    【解决方案1】:

    这是我的代码,它在我的设备上运行良好。

    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 框架!或者也许你可以找到那些确切的字符串并在那里输入......
    • 注意 2:当尝试将文本和图像发送到 LINE 应用程序时,这实际上不起作用……可能是 LINE 不支持它。 media.line.me/howto/en(格式 2)对我来说只有图像显示在 LINE 中。
    【解决方案2】:

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

    来自参考的项目描述是-

    项目

    粘贴板上的粘贴板项目。 @property(非原子,复制) NSArray *items 讨论

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

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

    【讨论】:

    • 感谢 Akshay 的回复
    • 这确实是正确的做法。为每个项目制作单独的 NSDictionary 对象。我已经做到了,它对我有用。看我的回答。
    • 从 iOS8 开始,粘贴到邮件应用程序时不再起作用。如果存在任何图像,它们将被粘贴而不是文本。
    【解决方案3】:

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

    像这样:

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

    【讨论】:

    • 当我对多个文本对象执行此操作时,似乎第一个对象之后的任何文本对象都在它们包含的第一个回车符处被截断。您是否看到过这种效果,或者您一直在使用不同的类型? stackoverflow.com/questions/7444590/…
    • 感谢 ecume des jours 的回复。
    【解决方案4】:

    很久以前就有人问过这个问题,但它仍然具有相关性 - 尤其是因为 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
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      在 iOS 中设置 persistent 布尔值似乎没有意义,来自 Apple:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多