質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4301閲覧

【swift】簡単なbarcode リーダーを作りたい

iphonex

総合スコア30

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2016/12/05 14:36

以下を参考に作成しましたが、swift3だとエラーだらけで、
使えません。swift3で使用数には、どうすればいいか教えてください。

http://swift-salaryman.com/avmetadataobject.php

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {

let session: AVCaptureSession = AVCaptureSession() var prevlayer: AVCaptureVideoPreviewLayer! var hview: UIView = UIView() override func viewDidLoad() { super.viewDidLoad() //準備(サイズ調整、ボーダーカラー、カメラオブジェクト取得、エラー処理) self.hview.autoresizingMask = UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.flexibleRightMargin self.hview.layer.borderColor = UIColor.green.cgColor self.hview.layer.borderWidth = 3 self.view.addSubview(self.hview) let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) var error : NSError? = nil //インプット let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput if input != nil { session.addInput(input)//カメラインプットセット }else { print(error) } //アウトプット let output = AVCaptureMetadataOutput() output.setMetadataObjectsDelegate(self, queue: DispatchQueue.maindispatch_get_main_queue()) session.addOutput(output)//プレビューアウトプットセット output.metadataObjectTypes = output.availableMetadataObjectTypes prevlayer = AVCaptureVideoPreviewLayer.withSession(session) as AVCaptureVideoPreviewLayer prevlayer.frame = self.view.bounds prevlayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(prevlayer) session.startRunning()//開始! } //バーコードが見つかった時に呼ばれる func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { var highlightViewRect = CGRectZero var barCodeObject : AVMetadataObject! var detectionString : String! //対応バーコードタイプ let barCodeTypes = [AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode ] //複数のバーコードの同時取得も可能 for metadata in metadataObjects { for barcodeType in barCodeTypes { if metadata.type == barcodeType { barCodeObject = self.prevlayer.transformedMetadataObject(for: metadata as! AVMetadataMachineReadableCodeObject) highlightViewRect = barCodeObject.bounds detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue self.session.stopRunning() break } } } println(detectionString) self.prevlayer.frame = highlightViewRect self.view.bringSubviewToFront(toFront: self.hview) }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fromageblanc

2016/12/05 15:47

コードブロック使ってください
guest

回答1

0

ベストアンサー

ビルドは出来るようにしてみましたが...

swift

1// Swift 3.0 2 3import UIKit 4import AVFoundation 5 6class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 7 8 let session: AVCaptureSession = AVCaptureSession() 9 var prevlayer: AVCaptureVideoPreviewLayer! 10 var hview: UIView = UIView() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 //準備(サイズ調整、ボーダーカラー、カメラオブジェクト取得、エラー処理) 16 /* 17 self.hview.autoresizingMask = UIViewAutoresizing.FlexibleTopMargin | 18 UIViewAutoresizing.FlexibleBottomMargin | 19 UIViewAutoresizing.FlexibleLeftMargin | 20 UIViewAutoresizing.FlexibleRightMargin 21 */ 22 self.hview.autoresizingMask = [.flexibleTopMargin,.flexibleBottomMargin,.flexibleLeftMargin,.flexibleRightMargin] 23 self.hview.layer.borderColor = UIColor.green.cgColor 24 self.hview.layer.borderWidth = 3 25 self.view.addSubview(self.hview) 26 let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 27 //var error : NSError? 28 29 //インプット 30 //let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput 31 let input :AVCaptureDeviceInput? 32 do{ 33 input = try AVCaptureDeviceInput(device: device) 34 session.addInput(input)//カメラインプットセット 35 } catch { 36 print(error) 37 } 38 39 /* 40 if input != nil { 41 session.addInput(input)//カメラインプットセット 42 }else { 43 print(error) 44 } 45 */ 46 //アウトプット 47 let output = AVCaptureMetadataOutput() 48 output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 49 session.addOutput(output)//プレビューアウトプットセット 50 output.metadataObjectTypes = output.availableMetadataObjectTypes 51 //prevlayer = AVCaptureVideoPreviewLayer.withSession(session) as AVCaptureVideoPreviewLayer 52 prevlayer = AVCaptureVideoPreviewLayer(session: session) 53 prevlayer.frame = self.view.bounds 54 prevlayer.videoGravity = AVLayerVideoGravityResizeAspectFill 55 self.view.layer.addSublayer(prevlayer) 56 57 session.startRunning()//開始! 58 } 59 60 //バーコードが見つかった時に呼ばれる 61 func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { 62 63 //var highlightViewRect = CGRectZero 64 var highlightViewRect = CGRect.zero 65 var barCodeObject : AVMetadataObject! 66 var detectionString : String! 67 68 //対応バーコードタイプ 69 let barCodeTypes = [AVMetadataObjectTypeUPCECode, 70 AVMetadataObjectTypeCode39Code, 71 AVMetadataObjectTypeCode39Mod43Code, 72 AVMetadataObjectTypeEAN13Code, 73 AVMetadataObjectTypeEAN8Code, 74 AVMetadataObjectTypeCode93Code, 75 AVMetadataObjectTypeCode128Code, 76 AVMetadataObjectTypePDF417Code, 77 AVMetadataObjectTypeQRCode, 78 AVMetadataObjectTypeAztecCode 79 ] 80 81 //複数のバーコードの同時取得も可能 82 for metadata in metadataObjects { 83 for barcodeType in barCodeTypes { 84 if metadata.type == barcodeType { 85 barCodeObject = self.prevlayer.transformedMetadataObject(for: metadata as! AVMetadataMachineReadableCodeObject) 86 highlightViewRect = barCodeObject.bounds 87 detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue 88 self.session.stopRunning() 89 break 90 } 91 } 92 } 93 print(detectionString) 94 self.prevlayer.frame = highlightViewRect 95 self.view.bringSubview(toFront: self.hview) 96 } 97}

シミュレータでランさせたらコケました。実機のテストができないのでとりあえずここまでで勘弁してくださいw

// コケる行 -> session.addOutput(output)//プレビューアウトプットセット Error Domain=AVFoundationErrorDomain Code=-11814 "Cannot Record" UserInfo={NSLocalizedDescription=Cannot Record, NSLocalizedRecoverySuggestion=Try recording again.}

エラー内容からすると実機でやれば動くような気がします

##追記
デリゲートメソッドを以下のように修正してください

swift

1 func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, 2 from connection: AVCaptureConnection!) { 3

投稿2016/12/05 15:45

編集2016/12/06 09:09
fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iphonex

2016/12/05 22:52

実機でエラーが出なかったので、動くような気がします。 値取得まで確認できないので、確認でき次第コメントします。
fromageblanc

2016/12/06 09:10

実機でやってみました。デリゲートメソッドを追記のように修正しないとコールされません。また、サラリーマンさんのとこのバーコードはリードできませんでした。(他のは出来る)
iphonex

2016/12/06 12:58

バッチり読み取り成功です。ありがとうございます。 追加で教えてください。 現在読み取り時の画面(カメラ)がフル画面になっており自動で読み取ります。 ボタン等を配置して、連続でバーコードの読み取りを可能にするには どういうロジックを書けば可能でしょうか。
fromageblanc

2016/12/06 13:59

それをするにはけっこうなステップ数の追加になるので新規でスレ立てた方が良いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問