SwiftUI:调用函数后未加载 UIImage (QRCode) [英] SwiftUI: UIImage (QRCode) does not load after calling function

查看:30
本文介绍了SwiftUI:调用函数后未加载 UIImage (QRCode)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了很多时间试图诊断这个问题,但我完全卡住了,也许我遗漏了一些非常明显的东西.

I have spent a lot of time trying to diagnose this issue and I am totally stuck, perhaps I am missing something very obvious.

已经尝试过:

  • 将返回的图像保存到磁盘以查看它是否正在生成正确(是)
  • 添加彩色背景会呈现一个正方形,因此正在加载某些内容
  • .renderingMode(.original)
  • 标记图像
  • 使用 @State var img = UIImage() 并重新分配usingImage(uiImage:img).onAppear {self.img = self.generateQRCode(来自:self.qrCodeString)!}
  • Saving the returned image to disk to see if it was being generated correctly (it was)
  • Adding a colored background renders a square, so something is being loaded
  • Marking the image with .renderingMode(.original)
  • Using @State var img = UIImage() and reassigning usingImage(uiImage:img).onAppear { self.img = self.generateQRCode(from: self.qrCodeString)! }

真诚地感谢任何帮助!

import SwiftUI

struct ContentView: View {

    let qrCodeString = "BEGIN:VCARD \n" +
    "VERSION:2.1 \n" +
    "FN:John Peter \n" +
    "N:Peter;John \n" +
    "TITLE:Admin \n" +
    "TEL;CELL:+91 431 524 2345 \n" +
    "TEL;WORK;VOICE:+91 436 542 8374 \n" +
    "EMAIL;WORK;INTERNET:John@ommail.in \n" +
    "URL:www.facebook.com \n" +
    "URL: www.instagram.com \n" +
    "ADR;WORK:;;423 ofce sales Center;Newark;DE;3243;USA \n" +
    "ORG:xxx Private limited \n" +
    "END:VCARD"

    var body: some View {
        Image(uiImage: generateQRCode(from: qrCodeString)!)
    }

    func generateQRCode(from string: String) -> UIImage? {
        let data = string.data(using: String.Encoding.ascii)

        if let filter = CIFilter(name: "CIQRCodeGenerator") {
            filter.setValue(data, forKey: "inputMessage")
            let transform = CGAffineTransform(scaleX: 3, y: 3)

            if let output = filter.outputImage?.transformed(by: transform) {

            return UIImage(ciImage: output)
            }
        }
        return nil
    }
}

推荐答案

这似乎可以解决问题:

func generateQRCode(from string: String) -> UIImage? {

    let data = string.data(using: String.Encoding.ascii)
    var uiImage: UIImage?
    if let filter = CIFilter(name: "CIQRCodeGenerator",
                             parameters: ["inputMessage": data,
                                          "inputCorrectionLevel": "L"]) {

        if let outputImage = filter.outputImage,
            let cgImage = CIContext().createCGImage(outputImage,
                                                    from: outputImage.extent) {
            let size = CGSize(width: outputImage.extent.width * 3.0,
                              height: outputImage.extent.height * 3.0)
            UIGraphicsBeginImageContext(size)
            if let context = UIGraphicsGetCurrentContext() {
                context.interpolationQuality = .none
                context.draw(cgImage,
                             in: CGRect(origin: .zero,
                                        size: size))
                uiImage = UIGraphicsGetImageFromCurrentImageContext()
            }
            UIGraphicsEndImageContext()
        }
    }
    return uiImage
}

这篇关于SwiftUI:调用函数后未加载 UIImage (QRCode)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆