You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Swift生成的二维码添加到Storyboard创建的UIView中

实现步骤

你可以通过两种方式实现需求,优先推荐第一种更轻量的方案:


方案1:直接复用二维码生成逻辑,不需要引入SwiftUI视图

修正原有代码的bug

你原有生成二维码的方法存在两处错误,会导致生成失败:

  • filter.setValue(data, forKey: "Inputmessage")的key拼写错误,正确为小写开头的inputMessage
  • 占位系统图片名错误,正确为xmark不是mark

ViewController 完整实现代码

import UIKit
import CoreImage.CIFilterBuiltins

class ViewController: UIViewController {
    @IBOutlet weak var QRImage: UIView!
    private let ciContext = CIContext()
    private let qrFilter = CIFilter.qrCodeGenerator()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupQrCode()
    }
    
    private func setupQrCode() {
        // 替换为你需要生成二维码的链接内容
        let targetUrl = "https://www.example.com"
        guard let qrImage = generateQrImage(content: targetUrl) else { return }
        
        // 创建UIImageView承载二维码
        let qrImageView = UIImageView(image: qrImage)
        qrImageView.contentMode = .scaleAspectFit
        qrImageView.translatesAutoresizingMaskIntoConstraints = false
        QRImage.addSubview(qrImageView)
        
        // 约束设置:让二维码撑满整个QRImage视图
        NSLayoutConstraint.activate([
            qrImageView.topAnchor.constraint(equalTo: QRImage.topAnchor),
            qrImageView.bottomAnchor.constraint(equalTo: QRImage.bottomAnchor),
            qrImageView.leadingAnchor.constraint(equalTo: QRImage.leadingAnchor),
            qrImageView.trailingAnchor.constraint(equalTo: QRImage.trailingAnchor)
        ])
    }
    
    /// 生成高清二维码图片
    private func generateQrImage(content: String) -> UIImage? {
        let contentData = Data(content.utf8)
        qrFilter.setValue(contentData, forKey: "inputMessage")
        
        guard let outputImage = qrFilter.outputImage else {
            return UIImage(systemName: "xmark")
        }
        // 放大原始低清二维码,避免显示模糊
        let scaleTransform = CGAffineTransform(scaleX: 10, y: 10)
        let scaledImage = outputImage.transformed(by: scaleTransform)
        
        guard let cgImage = ciContext.createCGImage(scaledImage, from: scaledImage.extent) else {
            return UIImage(systemName: "xmark")
        }
        return UIImage(cgImage: cgImage)
    }
}

方案2:保留原有SwiftUI的Qrview结构体,通过UIHostingController嵌入

如果你需要保留已经写好的SwiftUI Qrview,可通过UIKit提供的桥接工具实现嵌入:

  1. 先修正Qrview里提到的key和占位图片的bug
  2. 在ViewController中导入SwiftUI,用UIHostingController包装Qrview后添加到QRImage

对应代码示例

import UIKit
import SwiftUI

class ViewController: UIViewController {
    @IBOutlet weak var QRImage: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化SwiftUI二维码视图,替换为你的目标链接
        let qrSwiftUIView = Qrview(url: "https://www.example.com")
        let hostingController = UIHostingController(rootView: qrSwiftUIView)
        
        // 完成子控制器添加流程
        addChild(hostingController)
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        QRImage.addSubview(hostingController.view)
        
        NSLayoutConstraint.activate([
            hostingController.view.topAnchor.constraint(equalTo: QRImage.topAnchor),
            hostingController.view.bottomAnchor.constraint(equalTo: QRImage.bottomAnchor),
            hostingController.view.leadingAnchor.constraint(equalTo: QRImage.leadingAnchor),
            hostingController.view.trailingAnchor.constraint(equalTo: QRImage.trailingAnchor)
        ])
        
        hostingController.didMove(toParent: self)
    }
}

注意事项

  • 原始二维码生成的CIImage分辨率很低,添加放大变换可以有效避免显示模糊
  • 若使用方案2,必须完成子控制器的完整添加流程,否则可能出现手势响应、生命周期异常等问题

内容的提问来源于stack exchange,提问作者Greg W.F.R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:48:03