如何分享QR创建的图像swift 4

时间:2018-02-28 07:18:31

标签: ios swift image

我在swift中创建QR码并将其分配给imageView

当我尝试与生成的代码共享该图像时,它不会共享该图像,

func createCode()
{
    let text = email

    let data = text.data(using: .ascii, allowLossyConversion: false)
    fillter = CIFilter(name: "CIQRCodeGenerator")
    fillter.setValue(data, forKey: "inputMessage")
    let transform = CGAffineTransform(scaleX: 5.0, y: 5.0)

    CreatedImage = UIImage(ciImage: (fillter.outputImage?.transformed(by: transform))!)

    imageCode.image = CreatedImage as UIImage
}

这是分享按钮

@IBAction func shareButtonPressed(_ sender: Any)
{

    let activityItem: [UIImage] = [imageCode.image!]

    let activity = UIActivityViewController(activityItems: activityItem as [UIImage], applicationActivities: [])

    activity.popoverPresentationController?.sourceView  = self.view
    self.present(activity, animated: true, completion: nil)

}

它显示它没有什么可分享的,它不会选择任何一点图像

3 个答案:

答案 0 :(得分:0)

您是否创建了一个变量来将图像存储在某个地方,例如。

var generatedImage: UIImage?

假设我已经正确地阅读了你的问题,在你的创作函数中你可以在函数的末尾投射图像,例如:

generatedImage = imageCode.image

然后在你的分享功能中你可以说:

   guard let validQR = generatedImage else { return }

    let activityItem: [UIImage] = [validQR]

    let activity = UIActivityViewController(activityItems: activityItem as [UIImage], applicationActivities: [])

    activity.popoverPresentationController?.sourceView  = self.view
    self.present(activity, animated: true, completion: nil)

我测试了我的Bundle中的图像,例如:

 generatedImage = UIImage(named: "SCNPyramid")

我能够分享图像:)

答案 1 :(得分:0)

搜索所有..

我想知道以编程方式制作所需视图的屏幕截图,即发送..

答案 2 :(得分:0)

我遇到了同样的问题,并通过首先将生成的二维码图像保存到文件中,然后共享文件URL来解决了这个问题。

private func shareQRCode() {
    guard let qrcode = self.qrCodeImage,
          let data = qrcode.pngData(),
          let url = self.saveInCache(data: data, fileName: "QRCode.png") else { return }
    
    // set up activity view controller
    let imageToShare = [url]
    let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

    // work around to prevent dismissing current view after saving image
    let tempController = TransparentViewController()
    tempController.modalPresentationStyle = .overFullScreen

    activityViewController.completionWithItemsHandler = { [weak tempController] _, _, _, _ in
      if let presentingViewController = tempController?.presentingViewController {
        presentingViewController.dismiss(animated: false, completion: nil)
      } else {
        tempController?.dismiss(animated: false, completion: nil)
      }
    }

    present(tempController, animated: true) { [weak tempController] in
        tempController?.present(activityViewController, animated: true, completion: nil)
    }
}

这是saveInCache函数的代码:

private func saveInCache(data: Data, fileName: String) -> URL? {
    let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
    let path = paths[0]
    let fileUrl = path.appendingPathComponent(fileName)
    
    let fileManager = FileManager.default
    
    if self.pathExists(fileUrl) {
        do {
            try fileManager.removeItem(at: fileUrl)
        
        } catch { return fileUrl }
    }
    
    guard fileManager.createFile(atPath: fileUrl.path, contents: data, attributes: nil) else {
        return nil
    }
    
    return fileUrl
}

private func pathExists(_ path: URL) -> Bool {
    let fileManager = FileManager.default
    var isDir: ObjCBool = false
    
    if fileManager.fileExists(atPath: path.path, isDirectory: &isDir) {
        if isDir.boolValue {
            // file exists and is a directory
            return true
            
        } else {
            // file exists and is not a directory
            return true
        }
    } else {
        // file does not exist
        return false
    }
}

在这里,一个简单的用于ActivityViewController的透明视图控制器可以解决:

final class TransparentViewController: UIViewController {

    override func viewDidLoad() {
        self.view.backgroundColor = .clear
    }
}