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

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

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

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

Swift

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

Q&A

0回答

1532閲覧

Swift カメラアプリをデバイスの回転に対応できない

Fukuzawa3man

総合スコア10

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/11/19 05:24

前提・実現したいこと

swiftでカメラアプリを作成中です
縦での撮影はできるのですがデバイスを横回転させると写真の通りになってしまいます
イメージ説明

私が行いたいことは,横に全画面でカメラビューが表示されるようにすることです.
どうしてこうなったのか原因となったことも教えて欲しいです
よろしくお願いします

発生している問題

・横にすると90°回転になる
・ビューがいくつも表示される(カメラビュー動くのは中央の一つだけ)
・全画面にならない

該当のソースコード

Swift

1import UIKit 2import AVFoundation 3 4 5class ViewController: UIViewController, AVCapturePhotoCaptureDelegate { 6 //var img7 = UIImage(named:"iwamotoyama_ee-1200x880")! 7 var image2 = UIImage() 8 let shutter_image:UIImage = UIImage(named: "shutter.png")! 9 let button1 = UIButton(type: UIButton.ButtonType.system) 10 let shutter_button = UIButton() 11 12 13 @IBOutlet weak var cameraView: UIView! 14 15 16 var captureSesssion: AVCaptureSession! 17 var stillImageOutput: AVCapturePhotoOutput? 18 var previewLayer: AVCaptureVideoPreviewLayer? 19 20 //let cent = NotificationCenter.default 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 setView() 25 setbuttonView() 26 27 //opencvの基礎 バージョンを表示 28 //openCVversionLabel.text = OpenCVWrapper.openCVVersionString() 29 // Do any additional setup after loading the view, typically from a nib. 30 } 31 32/////////////// 33///画面の設定//// 34/////////////// 35 func setView(){ 36 captureSesssion = AVCaptureSession() 37 stillImageOutput = AVCapturePhotoOutput() 38 39 // 解像度の設定 40 captureSesssion.sessionPreset = AVCaptureSession.Preset.hd1920x1080 41 let device = AVCaptureDevice.default(for: AVMediaType.video) 42 43 do { 44 let input = try AVCaptureDeviceInput(device: device!) 45 46 // 入力 47 if (captureSesssion.canAddInput(input)) { 48 captureSesssion.addInput(input) 49 50 // 出力 51 if (captureSesssion.canAddOutput(stillImageOutput!)) { 52 53 // カメラ起動 54 captureSesssion.addOutput(stillImageOutput!) 55 captureSesssion.startRunning() 56 57 // アスペクト比、カメラの向き(縦) 58 previewLayer = AVCaptureVideoPreviewLayer(session: captureSesssion) 59 previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspect // アスペクトフィット 60 previewLayer?.connection!.videoOrientation = AVCaptureVideoOrientation.portrait 61 cameraView.layer.addSublayer(previewLayer!) 62 // ビューのサイズの調整 63 //cameraView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) 64 //previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2) 65 kaiten() 66 previewLayer?.bounds = cameraView.frame 67 } 68 } 69 } 70 catch { 71 print(error) 72 } 73 74 } 75 76 77////////////// 78//ボタンの設定// 79///////////// 80 func setbuttonView(){ 81 //シャッターボタンのimageを設定 82 shutter_button.setImage(shutter_image, for: .normal) 83 84 // ボタンを押した時に実行するメソッドを指定 85 button1.addTarget(self, action: #selector(saveImage(_:)), for: UIControl.Event.touchUpInside) 86 shutter_button.addTarget(self, action: #selector(cameraAction(_:)), for: UIControl.Event.touchUpInside) 87 // ラベルを設定する 88 button1.setTitle("確認", for: UIControl.State.normal) 89 // サイズ 90 button1.frame = CGRect(x: 0, y: 0, width: 80, height: 80) 91 shutter_button.frame = CGRect(x: 0, y: 0, width: 70, height: 70) 92 // 位置 93 button1.layer.position = CGPoint(x: 45, y:self.view.frame.height - 45) 94 shutter_button.layer.position = CGPoint(x: self.view.frame.width/2, y:self.view.frame.height - 45) 95 // 背景色 96 button1.backgroundColor = UIColor(red: 0.3, green: 0.7, blue: 0.6, alpha: 1) 97 // 枠の太さ 98 button1.layer.borderWidth = 0.5 99 // 枠の色 100 button1.layer.borderColor = UIColor(red: 0.3, green: 0.6, blue: 0.5, alpha: 1).cgColor 101 // 枠に丸み 102 button1.layer.cornerRadius = 25 103 104 // ここでUIに反映させてる 105 self.view.addSubview(button1) 106 self.view.addSubview(shutter_button) 107 self.view.backgroundColor = UIColor.cyan 108 109 } 110 111 //スマホの画面回転 112 override func viewDidLayoutSubviews() { 113 super.viewDidLayoutSubviews() 114 115 kaiten() 116 117 //image1.frame = CGRect(x: sx, y: sy, width: w, height: h) 118 //image1.image = image3 119 120 //cameraView.frame = CGRect(x: sx, y: sy, width: w, height: h) 121 //previewLayer?.position = CGPoint(x: px / 2, y: py / 2) 122 //previewLayer?.bounds = cameraView.frame 123 //previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2) 124 125 setView() 126 setbuttonView() 127 } 128 129 130 func kaiten(){ 131 // ここに回転時の処理 132 var deviceOrientation: UIDeviceOrientation! = UIDevice.current.orientation 133 switch UIApplication.shared.statusBarOrientation { 134 case .portrait: 135 //do something 136 cameraView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) 137 //previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2) 138 break 139 140 case .portraitUpsideDown: 141 //do something 142 cameraView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) 143 //previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2) 144 break 145 146 case .landscapeLeft: 147 //do something 148 cameraView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) 149 //previewLayer?.position = CGPoint(x: self.cameraView.frame.height / 2, y: self.cameraView.frame.width / 2) 150 break 151 152 case .landscapeRight: 153 //do something 154 cameraView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) 155 //previewLayer?.position = CGPoint(x: self.cameraView.frame.height / 2, y: self.cameraView.frame.width / 2) 156 break 157 case .unknown: 158 //default 159 break 160 } 161 162 previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2) 163 164 } 165 166 167 168 169 @objc func cameraAction(_ sender: AnyObject) { 170 // カメラの設定 171 let settingsForMonitoring = AVCapturePhotoSettings() 172 settingsForMonitoring.flashMode = .auto 173 settingsForMonitoring.isAutoStillImageStabilizationEnabled = true 174 settingsForMonitoring.isHighResolutionPhotoEnabled = false 175 176 // 撮影 177 stillImageOutput?.capturePhoto(with: settingsForMonitoring, delegate: self) 178 } 179 180 func photoOutput(_ output: AVCapturePhotoOutput, 181 didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 182 183 184 // JPEG形式で画像データを取得 185 let imageData = photo.fileDataRepresentation() 186 187 image2 = UIImage(data: imageData!)! 188 189 // アルバムに追加. 190 //UIImageWriteToSavedPhotosAlbum(image!, self, nil, nil) 191 // フォトライブラリに保存 192 } 193 @objc func saveImage(_ sender: AnyObject ) { 194 goToNextPage() 195 } 196 func goToNextPage(){ 197 //指定したIDのSegueを初期化する。同時にパラメータを渡すことができる 198 self.performSegue(withIdentifier: "mySegue", sender:image2) 199 } 200 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 201 if segue.identifier == "mySegue" { 202 let secondViewController = segue.destination as! Saveimage 203 secondViewController.image3 = image2 204 } 205 } 206 207 @IBAction func backToTop(segue: UIStoryboardSegue) {} 208 209}

試したこと

ソースコードのkaiten()部分です.
デバイスの回転を認識すると cameraView.frameの値を変えて回転の度にビューサイズを再構築する形にしたつもりです
パラーメーターをいじればいじるほど可笑しくなっていたので,ここではcameraView.frameのCGRectは縦の時で統一させています.

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

・Xcode10

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問