二维码 1: 如何用 swift 生成二维码

关注我,每天分享一个关于 iOS 的新知识

前言

现如今,二维码已经被广泛引用在生活中的各个场景中,比如支付、登录、推广链接等等。

从 iOS 11 开始,用户可以使用 iPhone 内置的相机应用扫描二维码以获取其中的信息。这让我们使用起来更加便捷,各种 App 也都增加了扫描和生成二维码的功能,今天就来讲讲如何使用 iOS 代码生成一个二维码。

在 iOS 中生成二维码

生成一个二维码主要用到的是 CoreImage 框架中的 CIFilter,直接上代码:

swift 复制代码
override func viewDidLoad() {
    super.viewDidLoad()
    
    let url = "https://apple.com"
    let qrImage = createQRCodeImage(content: url)
    let imageView = UIImageView(image: qrImage)
    view.addSubview(imageView)
    imageView.sizeToFit()
    imageView.center = view.center
}

func createQRCodeImage(content: String) -> UIImage? {
    guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
        return nil
    }
    let data = content.data(using: .utf8)
    filter.setValue(data, forKey: "inputMessage")
    guard let ciImage = filter.outputImage else {
        return nil
    }
    return UIImage(ciImage: ciImage)
}

createQRCodeImage 方法的作用是将传入的字符串内容转化为一个二维码图片:

  1. 创建一个名为 CIQRCodeGeneratorCIFilter 的过滤器,它是专门生成二维码的,这个构造方法可能会返回 nil,因为有些设备不支持或是其他原因,所以返回的是可选类型

  2. content 参数转成 Data

  3. 将上一步得到的数据作为输入设置给过滤器。"inputMessage" 是过滤器接受的 key,代表要生成二维码的信息

  4. 尝试调用 filter.outputImage 方法从过滤器获取生成的二维码图像。如果获取失败,则方法会返回 nil,这个方法拿到的是 CIImage 对象

  5. 最后将 CIImage 对象转成 UIImage 并返回

最后在屏幕上显示,此时运行程序,会发现二维码已经成功生成了:

只是这个尺寸也太小了,我试了一下手机都识别不到。

修改二维码尺寸

一个办法是直接设置 UIImageView 的尺寸,比如我将尺寸设置为 200 x 200:

arduino 复制代码
imageView.frame.size = CGSize(width: 200, height: 200)

再次运行程序,发现尺寸是变大了,但很模糊,虽然用手机能够成功识别了,但明显不符合预期:

其实正确调整二维码尺寸的方法是通过修改输出时的尺寸,CIImage 有个 transformed 的方法可以用来转换这个图片:

swift 复制代码
/* Returns a new image representing the original image with the transform
* 'matrix' appended to it. */
open func transformed(by matrix: CGAffineTransform) -> CIImage

我们再修改一下 createQRCodeImage 方法,让原来的图片放大一些:

swift 复制代码
func createQRCodeImage(content: String) -> UIImage? {
    guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
        return nil
    }
    let data = content.data(using: .utf8)
    filter.setValue(data, forKey: "inputMessage")
    let transform = CGAffineTransform(scaleX: 10, y: 10)
    guard let ciImage = filter.outputImage?.transformed(by: transform) else {
        return nil
    }
    return UIImage(ciImage: ciImage)
}

再次运行程序,这次就显示完美了:

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
碎_浪11 小时前
Mac 壁纸被 MDM 锁住?我做了个 2MB 的开源方案
macos·开源·swift
2501_9160088913 小时前
iOS 证书管理最佳实践 从创建到续期的完整指南
android·ios·小程序·https·uni-app·iphone·webview
黑科技iOS上架1 天前
ReactNative入门介绍
经验分享·ios
智塑未来1 天前
鸿蒙系统对比安卓、iOS,核心优势是什么?
android·ios·harmonyos
初雪云1 天前
iOS 上架入门:证书、描述文件、IPA 上传到底是什么关系?
android·ios·自动化·产品经理·iphone
狂热开发者1 天前
用 Typeoff 把会后口述整理成 Markdown 决策记录
人工智能·windows·macos·ios·安卓
小牛不牛的程序员1 天前
开源一个 macOS 剪贴板「意图识别」工具——不只是存储,更是理解你复制了什么
macos·swift
2501_916007471 天前
iPad 怎么抓包 从代理模式到暴力抓包的操作方法
android·ios·小程序·uni-app·代理模式·iphone·ipad
2501_915918411 天前
PerfDog 太贵?iOS 性能监控工具的功能对比与选择
android·ios·小程序·https·uni-app·iphone·webview
MDM.Plus2 天前
苹果MDM技术演进:从远程控制到设备信任体系的构建
运维·服务器·安全·ios·mdm·手机店