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

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

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

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

Q&A

解決済

1回答

1433閲覧

ストーリーボードなしでUIViewにカメラの映像を表示したい

fathy

総合スコア254

Swift

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

0グッド

0クリップ

投稿2018/12/24 01:07

編集2018/12/24 02:01

前提・実現したいこと

小窓のようなカメラ映像を表示しようと試みていますが,なんの表示も出ません。
ただ,同じ表示をストーリーボードで実現させようとすると表示されます。
また,コードだけでもViewControllerのviewにはカメラ映像を表示させることができます。
できるだけコードだけで書きたいです。
AVPreviewLayerの問題なのかと予想していますが,表示できるviewとできないviewの違いが分かりません。
どなたか教えて頂きたいです。
よろしお願いします。

該当のソースコード

import UIKit import AVFoundation class ViewController: UIViewController { var captureSession: AVCaptureSession! var stillImageOutput: AVCapturePhotoOutput! var previewLayer: AVCaptureVideoPreviewLayer! var cameraView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false return view }() let backgroundView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = .gray return view }() override func viewDidLoad() { super.viewDidLoad() setupViews() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) captureSession = AVCaptureSession() stillImageOutput = AVCapturePhotoOutput() captureSession.sessionPreset = .photo let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back) if let device = discoverySession.devices.first{ do { let input = try AVCaptureDeviceInput(device: device) // 入力 if (captureSession.canAddInput(input)) { captureSession.addInput(input) // 出力 if (captureSession.canAddOutput(stillImageOutput)) { captureSession.addOutput(stillImageOutput) captureSession.startRunning() previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspect previewLayer?.connection!.videoOrientation = AVCaptureVideoOrientation.portrait cameraView.layer.addSublayer(previewLayer!) previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2) previewLayer?.bounds = cameraView.frame } } } catch { print(error) } } } func setupViews(){ cameraView = UIView() cameraView.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(backgroundView) self.view.addSubview(cameraView) backgroundView.frame = self.view.frame self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[v(100)]-4-|", options: .alignAllTop, metrics: nil, views: ["v": cameraView])) self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-8-[v(100)]", options: .alignAllLeft, metrics: nil, views: ["v": cameraView])) } }

試したこと

backgroundColorなどを変更して試したところviewの存在は確認できました。
weak 宣言で書こうとしましたが,うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

xcode 10.1
macOS10.14.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

たぶんですが、cameraViewの座標指定にAuto Layoutの仕組みを使っているので、
viewWillAppearの中ではcameraView.frameは決定していないと思います。

previewLayer?.bounds = cameraView.frame // ここでは(0,0,0,0)のはず

Auto LayoutでcameraViewの座標が決定されたら、previewLayerのframeを調整してあげればうまく出ると思います。

例:

swift

1 override func viewDidLayoutSubviews() { 2 previewLayer?.frame = cameraView.bounds 3 }

投稿2018/12/24 02:02

takabosoft

総合スコア8356

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

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

fathy

2018/12/24 02:09

できました! ありがとうございます! 助かりました! またお力お借りするかもしれないのでその時は呆れずまた教えてください...! 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問