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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

3853閲覧

swiftでカメラの出力をUIViewの中に表示させたい

0-0.

総合スコア13

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

1クリップ

投稿2018/12/06 13:15

Xcode,swiftでQRコードを読み込むアプリを現在開発中です
下記のリンクをのコードを参考にさせていただきましたが、そのまま使用すると全画面がカメラ出力になってしまいます。
画像の灰色の部分でのみ表示させたいです。
swift初心者なので定かではないのですが、UIViewを宣言し、

let previewLayer = AVCaptureVideoPreviewLayer(session: self.session)

この辺りをいじればいけるのでは?と調べましたがわかりませんでした。
御教授の程よろしくお願いいたします

https://shinjism.com/blog/2017/10/qrcode.html

ソースイメージ説明

swift

1import Foundation 2import AVFoundation 3import UIKit 4 5class CameraViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 6 7 // カメラやマイクの入出力を管理するオブジェクトを生成 8 private let session = AVCaptureSession() 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Do any additional setup after loading the view, typically from a nib. 13 14 // カメラやマイクのデバイスそのものを管理するオブジェクトを生成(ここではワイドアングルカメラ・ビデオ・背面カメラを指定) 15 let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], 16 mediaType: .video, 17 position: .back) 18 19 // ワイドアングルカメラ・ビデオ・背面カメラに該当するデバイスを取得 20 let devices = discoverySession.devices 21 22 // 該当するデバイスのうち最初に取得したものを利用する 23 if let backCamera = devices.first { 24 do { 25 // QRコードの読み取りに背面カメラの映像を利用するための設定 26 let deviceInput = try AVCaptureDeviceInput(device: backCamera) 27 28 if self.session.canAddInput(deviceInput) { 29 self.session.addInput(deviceInput) 30 31 // 背面カメラの映像からQRコードを検出するための設定 32 let metadataOutput = AVCaptureMetadataOutput() 33 34 if self.session.canAddOutput(metadataOutput) { 35 self.session.addOutput(metadataOutput) 36 37 metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 38 metadataOutput.metadataObjectTypes = [.qr] 39 40 // 背面カメラの映像を画面に表示するためのレイヤーを生成 41 let previewLayer = AVCaptureVideoPreviewLayer(session: self.session) 42 previewLayer.frame = self.view.bounds 43 previewLayer.videoGravity = .resizeAspectFill 44 self.view.layer.addSublayer(previewLayer) 45 46 // 読み取り開始 47 self.session.startRunning() 48 } 49 } 50 } catch { 51 print("Error occured while creating video device input: (error)") 52 } 53 } 54 } 55 56 override func didReceiveMemoryWarning() { 57 super.didReceiveMemoryWarning() 58 // Dispose of any resources that can be recreated. 59 } 60 61 func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { 62 for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] { 63 // QRコードのデータかどうかの確認 64 if metadata.type != .qr { continue } 65 66 // QRコードの内容が空かどうかの確認 67 if metadata.stringValue == nil { continue } 68 69 /* 70 このあたりで取得したQRコードを使ってゴニョゴニョする 71 読み取りの終了・再開のタイミングは用途によって制御が異なるので注意 72 以下はQRコードに紐づくWebサイトをSafariで開く例 73 */ 74 75 // URLかどうかの確認 76 if let url = URL(string: metadata.stringValue!) { 77 // 読み取り終了 78 self.session.stopRunning() 79 // QRコードに紐付いたURLをSafariで開く 80 UIApplication.shared.open(url, options: [:], completionHandler: nil) 81 82 break 83 } 84 } 85 } 86}

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

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

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

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

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

guest

回答1

0

自己解決

悩んでいましたがやってみたらできました。

@IBOutlet weak var cameraview: UIView! //~~~~~~~省略~~~~~~~ let previewLayer = AVCaptureVideoPreviewLayer(session: self.session) previewLayer.frame = self.//camera//view.bounds previewLayer.videoGravity = .resizeAspectFill self.//camera//view.layer.addSublayer(previewLayer) ```

投稿2018/12/06 14:25

0-0.

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問