【问题标题】:Swift UIPasteboard not copying PNGSwift UIPasteboard 不复制 PNG
【发布时间】:2014-09-18 12:30:05
【问题描述】:

我的问题真的很奇怪。在模拟器中,.png 可以很好地复制到剪贴板,我可以将图像粘贴到模拟器上的联系人应用程序中。但是当我将应用程序放在手机上时,png不会复制到剪贴板。

let img = UIImage(named: "myimage")
let data = NSData(data: UIImagePNGRepresentation(img) )
UIPasteboard.generalPasteboard().setData(data, forPasteboardType: "public.png")

这是我正在使用的代码,但就像我说的那样,它不会复制到剪贴板。我在键盘上下文中使用此代码,尽管在复制到剪贴板时这无关紧要。如果有人有任何想法,请告诉我。提前致谢!哦,这是我在 Swift 中的第一个应用程序和我的第一个 iOS 应用程序,所以我没有经验知道这是一个 Swift 问题还是我只是想念的东西。 =\

【问题讨论】:

  • 您是否验证了图像加载正确并且 ing 和 data 不为零?
  • 你找到解决方案了吗,遇到同样的问题
  • 你找到解决方案了吗,这里有同样的问题。
  • @Ramakrishna UIPasteboard.general.image = img 应该适用于任何类型的图像

标签: swift


【解决方案1】:

确保代码在您的主机应用(不是键盘扩展应用)中运行良好。 例如,检查读取的图像是否具有相同的分辨率:

    //the Pasteboard is nil if full access is not granted
    let pbWrapped: UIPasteboard? = UIPasteboard.generalPasteboard()
    if let pb = pbWrapped {
        var type = UIPasteboardTypeListImage[0] as! String
        if (count(type) > 0) && (image != nil) {
            pb.setData(UIImagePNGRepresentation(image), forPasteboardType: type)
            var readDataWrapped: NSData? = pb.dataForPasteboardType(type)
            if let readData = readDataWrapped {
                var readImage = UIImage(data: readData, scale: 2)
                println("\(image) == \(pb.image) == \(readImage)")
            }
        }
    }

如果您的键盘应用中的粘贴板对象为 nil,则表示您尚未提供对键盘的完全访问权限:Copying and pasting image into a textbook in simulator

【讨论】:

  • 我已从设置中授予完全访问权限。我可以在“消息”应用程序中粘贴文本。但无法粘贴贴纸图像。虽然我可以在“Note”应用程序中粘贴贴纸图像!有什么想法吗?
  • kb290:确保您将图像传递到 iMessage 聊天。您无法通过 SMS 发送图像,因此此类聊天无法粘贴。
  • 我从你的回答中得到了解决方案...:) stackoverflow.com/questions/27307156/…
【解决方案2】:

我相信你可以使用这条线做你想做的事(现在无法测试):

let image = UIImage(named: "myimage.png")
UIPasteboard.generalPasteboard().image = image;

希望这行得通,我对 UIPasteboard 有点生疏了。

【讨论】:

  • 我试过你刚才输入的内容。但不幸的是,在粘贴时,它只是粘贴了 iOS 剪贴板中的最后一件事。有没有办法在复制到剪贴板之前清除它?
  • 如果您能验证它在 Swift 中是否有效,那就太好了,因为我已经尝试了很多不同的方法,但仍然一无所获。
  • 这应该可行,“设置此属性会将粘贴板中的所有当前项目替换为新项目。”
  • 是的,大卫哈哈,我知道它应该可以工作,但事实是由于某种原因它不起作用^_^
  • 嘿,Bloodhound 先生,哈哈听起来很正式,事实上你得到的是最后一个被复制到剪贴板的东西(而不是你复制的东西),我认为这意味着 NSData当您创建 UIImage 时,从您的 UIImage 创建失败可能是因为缺少扩展名。所以也许大卫说你的数据可能是零是对的。
【解决方案3】:

UIPasteboard 类有很多错误和问题,所以我真的并不感到惊讶,你遇到了一些显然应该工作的问题。老实说,文档也没有那么有用。但是试试这个;这在物理设备上对我有用,它与上述应该有效但显然不适用于一群人的方法不同。

guard let imagePath = NSBundle.mainBundle().pathForResource("OliviaWilde", ofType: "jpg") else
{ return }

guard let imageData = NSData(contentsOfFile: imagePath) else { return }

let pasteboard = UIPasteboard.generalPasteboard()

pasteboard.setData(imageData, forPasteboardType: "public.jpeg")

如果源文件是 .jpg,您可以使用“public.jpeg”或“public.png”;它仍然有效。我认为它只会改变被粘贴的东西的格式?

另外,您是否尝试在创建 UIImage 的第一行代码中添加文件扩展名?这也可能使它起作用。

显然使用这个类是喜怒无常的,不仅仅是在这个用例中。因此,即使我们在做同样的事情,这段代码的唯一区别是我们是从路径而不是 UIImage 创建 NSData。大声笑让我知道这是否适合你。

【讨论】:

    【解决方案4】:

    确保 RequestsOpenAccess 在扩展程序的NSExtension 下设置为YES > NSExtensionAttributes 在扩展程序的info.plist

    【讨论】:

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