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

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

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

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

Q&A

解決済

4回答

465閲覧

SwiftUIとStoryboardについて

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2020/09/15 23:56

最近xcodeを触り始めた初心者です。
動画撮影できるアプリを作成しようとしています。
下記のプログラムを参考にしようと考えているのですか、これはSwiftUIで記述しているのでしょうか?それともStoryboardで記述しているのでしょうか?ご回答頂けると嬉しいです。

https://qiita.com/daigou26/items/74bbdfce46db8898fb47[リンク内容]

使用環境:xcode11.6、swift5を使っています。

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

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

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

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

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

guest

回答4

0

基本的にtsuki01さんご回答通り、参照されているコードは Swift + StroyBoard での開発です。

ただ、注意しなければならない点がいくつかあります。

##1.ページ末尾のソースコードの変数参照の誤りがあるのと、Swift5で引数が変更になったメソッドがあるので、それぞれ適切に変更する。

以下は改変後のソースです。

Swift

1import UIKit 2import AVFoundation 3import Photos 4 5class RecordViewController: UIViewController, AVCaptureFileOutputRecordingDelegate { 6 let fileOutput = AVCaptureMovieFileOutput() 7 8 var recordButton: UIButton! 9 var isRecording = false 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 setUpPreview() 15 } 16 17 func setUpPreview() { 18 let videoDevice = AVCaptureDevice.default(for: AVMediaType.video) 19 let audioDevice = AVCaptureDevice.default(for: AVMediaType.audio) 20 21 do { 22 if videoDevice == nil || audioDevice == nil { 23 throw NSError(domain: "device error", code: -1, userInfo: nil) 24 } 25 let captureSession = AVCaptureSession() 26 27 // video inputを capture sessionに追加 28 let videoInput = try AVCaptureDeviceInput(device: videoDevice!) 29 captureSession.addInput(videoInput) 30 31 // audio inputを capture sessionに追加 32 let audioInput = try AVCaptureDeviceInput(device: audioDevice!) 33 captureSession.addInput(audioInput) 34 35 // max 30sec 36 self.fileOutput.maxRecordedDuration = CMTimeMake(value: 30, timescale: 1) 37 captureSession.addOutput(fileOutput) 38 39 // プレビュー 40 let videoLayer : AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 41 videoLayer.frame = self.view.bounds 42 videoLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 43 self.view.layer.addSublayer(videoLayer) 44 45 captureSession.startRunning() 46 47 setUpButton() 48 } catch { 49 // エラー処理 50 } 51 } 52 53 func setUpButton() { 54 recordButton = UIButton(frame: CGRect(x: 0,y: 0,width: 120,height: 50)) 55 recordButton.backgroundColor = UIColor.gray 56 recordButton.layer.masksToBounds = true 57 recordButton.setTitle("録画開始", for: .normal) 58 recordButton.layer.cornerRadius = 20.0 59 recordButton.layer.position = CGPoint(x: self.view.bounds.width/2, y:self.view.bounds.height-50) 60 recordButton.addTarget(self, action: #selector(RecordViewController.onClickRecordButton(sender:)), for: .touchUpInside) 61 62 self.view.addSubview(recordButton) 63 } 64 65 @objc func onClickRecordButton(sender: UIButton) { 66 if !isRecording { 67 // 録画開始 68 let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 69 let documentsDirectory = paths[0] as String 70 let filePath : String? = "(documentsDirectory)/temp.mp4" 71 let fileURL : NSURL = NSURL(fileURLWithPath: filePath!) 72 fileOutput.startRecording(to: fileURL as URL, recordingDelegate: self) 73 74 isRecording = true 75 changeButtonColor(target: recordButton, color: UIColor.red) 76 recordButton.setTitle("録画中", for: .normal) 77 } else { 78 // 録画終了 79 fileOutput.stopRecording() 80 81 isRecording = false 82 changeButtonColor(target: recordButton, color: UIColor.gray) 83 recordButton.setTitle("録画開始", for: .normal) 84 } 85 } 86 87 func changeButtonColor(target: UIButton, color: UIColor) { 88 target.backgroundColor = color 89 } 90 91 func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { 92 // ライブラリへ保存 93 PHPhotoLibrary.shared().performChanges({ 94 PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: outputFileURL) 95 }) { completed, error in 96 if completed { 97 print("Video is saved!") 98 } 99 } 100 } 101}

##2.StoryBoard には、ViewController を一つだけ配置し、そのカスタムクラスを RecordViewController に設定する。

カスタムクラスの設定がわからない、ということであれば、上記のソースコードのうち

Swift

1class RecordViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {

Swif

1class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {

にすることでも解決します。

##3.プライバシーが強化されているため、ビデオ録画、音声録音、ならびにフォトライブラリへの保存については許可を出すように設定する。

これらの設定をわすれると、実行時にクラッシュします。

クラッシュした時に出てきたメッセージに沿って必要な設定を行えば良いのですが、基本的に次の3つの値を Info.plist に対して適切に設定します。

  • Privacy - Camera Usage Description
  • Privacy - Microphone Usage Description
  • Privacy - Photo Library Usage Description

追加方法については、この辺りの前半の内容が参考になるのではないでしょうか。

##4.実機で動作させる

一番重要なことですが、実機でないと動かせません。

投稿2020/09/16 01:37

TsukubaDepot

総合スコア5086

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

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

退会済みユーザー

退会済みユーザー

2020/09/24 13:08

コメント遅くなり、申し訳ありません。丁寧に回答ありがとうございました。実は修正してくださったこのコードを打ち込み、info.plistも設定してビルドしたのですが、アプリを開いてもホーム画面に戻ってしまいます。ビルド後、storyboardの設定ができていなかったのが原因で戻ってしまったのと、学校の先生にRecordViewController.swiftだけではエラーがでていなくてもできないだろうと言われました。しかし、参考にしたコードはRecordViewController.swift以外は見当たりませんでした。これ以外に用意しなければならないコードファイルがあれば教えていただけると幸いです。
TsukubaDepot

2020/09/24 13:21

「アプリを開いてもホーム画面に戻ってしまいます」というのは、どういう状態でしょうか。 実機で動かし、エラーがでているのであれば、Xcode上にエラーコードが出ているはずです。 「RecordViewController.swiftだけではエラーがでていなくてもできないだろうと言われました。」 いえ、RecordViewController.swift だけで実行できます。ただし、上記の回答の2. の内容を正しく反映させる必要があります。 カスタムクラスの変更という作業はおこなってみたのでしょうか。
guest

0

カスタムクラスの設定を行った後、全ての設定を見直して再度ビルドさせたらできました!ありがとうございました。

投稿2020/09/30 15:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

SwiftUIが発表されたのが2019年6月で、その記事が書かれたのは2018年8月です。

ref.
Apple、アプリケーション開発のための画期的な新しいテクノロジーを発表

投稿2020/09/16 01:31

fuzzball

総合スコア16733

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

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

退会済みユーザー

退会済みユーザー

2020/09/24 13:10

コメント遅くなり申し訳ありません! 回答ありがとうございます。記事を読ませていただきました!助かりました!!
guest

0

ベストアンサー

文法的にStoryboardを利用して開発されているものと思います。

※以下リンク先の、SwiftUIの文法と比較すると異なる。
SwiftUIの文法 その1 View

投稿2020/09/16 01:10

tsuki01

総合スコア1751

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

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

退会済みユーザー

退会済みユーザー

2020/09/24 13:13

コメント遅くなって申し訳ありません!回答ありがとうございました。 SwiftUIとstoryboardでは言語が同じでも文法や画面遷移のやり方は違うのですね…参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問