1.系統方式
二維碼掃描
掃描只有在真機上可以測試
import UIKit
//系統掃描需要AVFoundation框架的支持
import AVFoundation
class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate {
//拍攝繪畫
var captureSession: AVCaptureSession!
//顯示圖層
var previewLayer: AVCaptureVideoPreviewLayer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
//開始掃描
@IBAction func startCuptureAction(sender: UIButton) {
//調用輸入設備(攝像頭)
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
//輸入輸出信息
//輸入:主要為了檢測是否有設備
do {
let input = try AVCaptureDeviceInput(device: device)
//輸出:主要是為了獲取掃描結果
let output = AVCaptureMetadataOutput()
//設置代理(設置隊列為主隊列是為了掃描到結果后可以立馬在主隊列中秀按時出來)
//需要遵循AVCaptureMetadataOutputObjectsDelegate協議
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
//初始化會話:實現掃描的核心類
self.captureSession = AVCaptureSession()
//將輸入輸出添加到會話中
self.captureSession.addInput(input)
self.captureSession.addOutput(output)
//創(chuàng)建顯示圖層
self.previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
//設置大小
self.previewLayer.frame = self.view.bounds
self.view.layer.addSublayer(self.previewLayer)
//開啟會話
self.captureSession.startRunning()
}catch{
print("檢測不到設備")
}
}
//協議方法
//掃描完成后的回調
//參數:掃描結果,返回的是數組
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
//停止會話
self.captureSession.stopRunning()
//移除顯示圖層
self.previewLayer.removeFromSuperlayer()
//獲取結果
//metadataObjects只會有一個結果
if metadataObjects.count > 0 {
let object = metadataObjects.first as! AVMetadataMachineReadableCodeObject
print(object.stringValue)
}
}
}
二維碼生成
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//創(chuàng)建濾鏡處理器
//CIQRCodeGenerator:系統的Key值
let filter = CIFilter(name: "CIQRCodeGenerator")
//設置二維碼攜帶信息
let str = "http://www.baidu.com"
//將信息設置給filter--數據類型為data
//inputMessage:系統Key值
let data = str.dataUsingEncoding(NSUTF8StringEncoding)
filter?.setValue(data, forKey: "inputMessage")
//獲取信息
let outputImage = filter?.outputImage//CIImage類型
//轉化圖片
let image = UIImage(CIImage: outputImage!)
//顯示
let imageView = UIImageView(frame: CGRectMake(0,0,200,200))
imageView.image = image
self.view.addSubview(imageView)
}
}

生成結果
2.使用第三方庫ZBarSDK
步驟:
1.拖入第三方庫并橋接

包含
2.靜態(tài)庫

ZBar導入靜態(tài)庫.png
實現
import UIKit
//常用的關于二維碼生成和掃描的第三方包括ZBarSDK和ZXingSDK,由于ZXingSDK集成比較復雜,并且已經停止更新。ZBarSDK封裝自系統CIFilter(濾鏡處理器)和AVCaptureSession
class ViewController: UIViewController {
@IBOutlet weak var erWeiMaImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
//二維碼生成
//參數1:二維碼攜帶信息
//參數2:二維碼的清晰度(0-500),數值越大越清晰
erWeiMaImageView.image = QRCodeGenerator.qrImageForString("http://www.baidu.com", imageSize: 400)
}
//掃描
@IBAction func captureAction(sender: UIButton) {
//參數1:如果true,表示關閉二維碼掃描,只掃描條形碼
//閉包參數1:掃描結果
//參數2:是否掃描成功
let customVC = CustomViewController(isQRCode: false) { (result, isSuccess) -> Void in
if isSuccess{
print("掃描成功\(result)")
//在實際開發(fā)中掃描成功后一般會跳轉頁面,將result進行傳值
}
else{
print("掃描失敗")
}
}
self.presentViewController(customVC, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}