在二维码中间叠加图像ios

overlay image in the middle of qr code ios

我正在将图像叠加到生成的二维码上。 但是当我尝试将位置图像更改为中心时,它不会移动到中心,而是移动到另一个地方。

这是我的代码二维码

 let overlayImage = UIImage(named: "asdasd")
    var overlayImageView = UIImageView(image: overlayImage)


    var QRCodeImage: CIImage!

    var barcodeImage: CIImage!

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

        let data =  string.data(using: String.Encoding.isoLatin1)

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

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


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

下面是显示叠加图像和二维码的代码

     if (QRCodeImage == nil && barcodeImage == nil) {

            if let actualText = QRText.text {


                let imageQRCode = generateQRCode(from: actualText)
                let imageBarcode = generateBarcode(from: actualText)


                overlayImageView.frame = CGRect(x: 0, y: 0, width: 45, height: 45)
                overlayImageView.center = imgQRCode.center //////////
                overlayImageView.contentMode = .scaleAspectFill
                imgQRCode.addSubview(overlayImageView)




                var mainImageView = UIImageView(image:imageQRCode)
                mainImageView.addSubview(overlayImageView)


                imgQRCode.image = imageQRCode
                imgBarcode.image = imageBarcode


        }

我使用 overlayImageView.center 得到的结果是

location of image in the bottom of the qr code

试试这样的操作,它会在视图中居中。

居中UIImageView的重要代码行如下:

overlayImageView.translatesAutoresizingMaskIntoConstraints = false
overlayImageView.contentMode = .center

qrCodeImageView.addSubview(overlayImageView)

let centerXConst = NSLayoutConstraint(item: overlayImageView, attribute: .centerX, relatedBy: .equal, toItem: qrCodeImageView, attribute: .centerX, multiplier: 1, constant: 0)
let centerYConst = NSLayoutConstraint(item: overlayImageView, attribute: .centerY, relatedBy: .equal, toItem: qrCodeImageView, attribute: .centerY, multiplier: 1, constant: 0)
NSLayoutConstraint.activate([centerXConst, centerYConst])

我使用这个确切的代码在 QR 码上将图标居中:

class ViewController: UIViewController {

    @IBOutlet weak var qrCodeImageView: UIImageView!
    var qrCodeImage: CIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let textField = "fooqarcode"
        let data = textField.data(using: String.Encoding.isoLatin1, allowLossyConversion: false)

        let filter = CIFilter(name: "CIQRCodeGenerator")

        filter?.setValue(data, forKey: "inputMessage")
        filter?.setValue("Q", forKey: "inputCorrectionLevel")

        qrCodeImage = (filter?.outputImage)!

        let scaleX = qrCodeImageView.frame.size.width / qrCodeImage.extent.size.width
        let scaleY = qrCodeImageView.frame.size.height / qrCodeImage.extent.size.height

        let transformedImage = qrCodeImage.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY))
        qrCodeImageView.image = UIImage(ciImage: transformedImage)

        let overlayImageView = UIImageView(image: UIImage(named: "block.png"))
        overlayImageView.translatesAutoresizingMaskIntoConstraints = false
        overlayImageView.contentMode = .center

        qrCodeImageView.addSubview(overlayImageView)

        let centerXConst = NSLayoutConstraint(item: overlayImageView, attribute: .centerX, relatedBy: .equal, toItem: qrCodeImageView, attribute: .centerX, multiplier: 1, constant: 0)
        let centerYConst = NSLayoutConstraint(item: overlayImageView, attribute: .centerY, relatedBy: .equal, toItem: qrCodeImageView, attribute: .centerY, multiplier: 1, constant: 0)
        NSLayoutConstraint.activate([centerXConst, centerYConst])
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}