完成したコード
AddFriendView
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "conform"{
let vc = segue.destination as! FriendConformView
let data = sender as! UserData
vc.userID = data.id
vc.name = data.name
}
if segue.identifier == "qr"{
let vc = segue.destination as! QRScanner
vc.qrScaned = {
id in
self.conform(id: id)
}
}
}
QRScanner
import AVFoundation
import AudioToolbox
import UIKit
class QRScanner:UIViewController,AVCaptureMetadataOutputObjectsDelegate {
@IBAction func onBack(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
@IBOutlet weak var backButton: UIButton!
var qrScaned = {(result:String)in}
let captureSession = AVCaptureSession()
var videoPreviewLayer:AVCaptureVideoPreviewLayer?
var qrCodeFrameView:UIView?
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position:.back)
override func viewDidLoad() {
super.viewDidLoad()
guard let captureDevice = deviceDiscoverySession.devices.first else {
print("Failed to get the camera device")
return
}
do {
let input = try AVCaptureDeviceInput(device: captureDevice)
captureSession.addInput(input)
let captureMetadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(captureMetadataOutput)
captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
videoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession)
videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoPreviewLayer?.frame = view.layer.bounds
view.layer.addSublayer(videoPreviewLayer!)
self.captureSession.startRunning()
qrCodeFrameView = UIView()
view.bringSubviewToFront(backButton)
if let qrCodeFrameView = qrCodeFrameView {
qrCodeFrameView.layer.borderColor = UIColor.green.cgColor
qrCodeFrameView.layer.borderWidth = 2
view.addSubview(qrCodeFrameView)
view.bringSubviewToFront(qrCodeFrameView)
}
} catch {
print(error)
return
}
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count == 0 {
qrCodeFrameView?.frame = CGRect.zero
return
}
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if metadataObj.type == AVMetadataObject.ObjectType.qr {
let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
qrCodeFrameView?.frame = barCodeObject!.bounds
if metadataObj.stringValue != nil {
captureSession.stopRunning()
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
DispatchQueue.main.asyncAfter(deadline: .now() + 1){
self.dismiss(animated: true, completion: nil)
self.qrScaned(metadataObj.stringValue!)
}
}
}
}
}
コメント