JANコードを読み取りたいのですが調べてもネット上には古いコードしかなくてエラーがでてしまいま
今風の書き方を教えて下さい
swift
1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 5 6 @IBOutlet weak var previewView: UIView! 7 @IBOutlet weak var label: UILabel! 8 9 let detectionArea = UIView() 10 var timer: Timer! 11 var counter = 0 12 var isDetected = false 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 // セッションのインスタンス生成 18 let captureSession = AVCaptureSession() 19 20 // 入力(背面カメラ) 21 let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 22 let videoInput = try! AVCaptureDeviceInput.init(device: videoDevice) 23 captureSession.addInput(videoInput) 24 25 // 出力(ビデオデータ) 26 let metadataOutput = AVCaptureMetadataOutput() 27 captureSession.addOutput(metadataOutput) 28 29 // メタデータを検出した際のデリゲート設定 30 metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 31 // EAN-13コードの認識を設定 32 metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.ean13,AVMetadataObject.ObjectType.ean8] 33 34 // 検出エリアのビュー 35 let x: CGFloat = 0.05 36 let y: CGFloat = 0.3 37 let width: CGFloat = 0.9 38 let height: CGFloat = 0.2 39 40 detectionArea.frame = CGRect(x: view.frame.size.width * x, y: view.frame.size.height * y, width: view.frame.size.width * width, height: view.frame.size.height * height) 41 detectionArea.layer.borderColor = UIColor.red.cgColor 42 detectionArea.layer.borderWidth = 3 43 view.addSubview(detectionArea) 44 45 // 検出エリアの設定 46 metadataOutput.rectOfInterest = CGRect(x: y,y: 1-x-width,width: height,height: width) 47 48 // プレビュー 49 if let videoLayer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession) { 50 videoLayer.frame = previewView.bounds 51 videoLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 52 previewView.layer.addSublayer(videoLayer) 53 } 54 55 // セッションの開始 56 DispatchQueue.global(qos: .userInitiated).async { 57 captureSession.startRunning() 58 } 59 60 timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) 61 timer.fire() 62 } 63 64 func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 65 // 複数のメタデータを検出できる 66 for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] { 67 // EAN-13Qコードのデータかどうかの確認 68 if metadata.type == AVMetadataObject.ObjectType.ean13 || metadata.type == AVMetadataObject.ObjectType.ean8{ 69 if metadata.stringValue != nil { 70 // 検出データを取得 71 counter = 0 72 if !isDetected || label.text != metadata.stringValue! { 73 isDetected = true 74 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) // バイブレーション 75 label.text = metadata.stringValue! 76 detectionArea.layer.borderColor = UIColor.white.cgColor 77 detectionArea.layer.borderWidth = 5 78 } 79 } 80 } 81 } 82 } 83 84 @objc func update(tm: Timer) { 85 counter += 1 86 print(counter) 87 if 1 < counter { 88 detectionArea.layer.borderColor = UIColor.red.cgColor 89 detectionArea.layer.borderWidth = 3 90 label.text = "" 91 } 92 } 93} 94
// 入力(背面カメラ)
let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
の部分でType 'AVCaptureDevice' has no member 'defaultDevice'というエラーが出ます
どう書けばいいのですか?
あと
// プレビュー
if let videoLayer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession) {
videoLayer.frame = previewView.bounds
videoLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
previewView.layer.addSublayer(videoLayer)
}
の部分でもNon-optional expression of type 'AVCaptureVideoPreviewLayer' used in a check for optionalsというエラーが出ます
ここもどう書けば今の書き方なのか教えていただければ幸いです
あなたの回答
tips
プレビュー