关注我,每天分享一个关于 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
方法的作用是将传入的字符串内容转化为一个二维码图片:
-
创建一个名为
CIQRCodeGenerator
的CIFilter
的过滤器,它是专门生成二维码的,这个构造方法可能会返回 nil,因为有些设备不支持或是其他原因,所以返回的是可选类型 -
将
content
参数转成Data
-
将上一步得到的数据作为输入设置给过滤器。"inputMessage" 是过滤器接受的 key,代表要生成二维码的信息
-
尝试调用
filter.outputImage
方法从过滤器获取生成的二维码图像。如果获取失败,则方法会返回 nil,这个方法拿到的是CIImage
对象 -
最后将
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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!