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

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

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

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

Q&A

解決済

1回答

1309閲覧

[Swift] UILongPressGestureRecognizerでの録音について

R3.S

総合スコア44

Swift

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

0グッド

0クリップ

投稿2019/07/21 08:07

編集2019/07/23 06:57

イメージ説明

イメージ説明
イメージ説明

実現したいこと

マイクの画像を
・タップすると、録音した音声が再生。
・もう一度タップで停止。
・長押し中は、音声の録音。
・長押し解除で、録音終了。

起こっている問題

1.タップで再生中、待機中のラベルの変化はあるが、長押し後3.になる。
2.マイクの画像を長押ししているが、録音が始まらない。(ラベルの表示も録音中とならない)
3.長押し後、タップすると、ラベルの表示(再生中や待機中)が変らない、再生されない。

コード

swift

1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController,AVAudioRecorderDelegate,AVAudioPlayerDelegate { 5 6 @IBOutlet var record: UILongPressGestureRecognizer! 7 8 @IBOutlet weak var label: UILabel! 9 10 @IBOutlet var play: UITapGestureRecognizer! 11 12 var audioRecorder: AVAudioRecorder! 13 var audioPlayer: AVAudioPlayer! 14 var isRecording = false 15 var isPlaying = false 16 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 } 22 23 24 @IBAction func record(_ sender: UILongPressGestureRecognizer) { 25 print("record") 26 27 if !isRecording{ 28 let session = AVAudioSession.sharedInstance() 29 try! session.setCategory(AVAudioSession.Category.playAndRecord) 30 31 try! session.setActive(true) 32 let settings = [ 33 AVFormatIDKey: Int(kAudioFormatMPEG4AAC), 34 35 AVSampleRateKey: 44100, 36 AVNumberOfChannelsKey: 2, 37 AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue] 38 39 audioRecorder = try! AVAudioRecorder(url: getURL(), settings: settings) 40 audioRecorder.delegate = self 41 audioRecorder.record() 42 isRecording = true 43 label.text = "録音中" 44 record.isEnabled = false 45 play.isEnabled = false 46 }else{ 47 audioRecorder.stop() 48 isRecording = false 49 label.text = "待機中" 50 play.isEnabled = true 51 } 52 } 53 54 func getURL() -> URL{ 55 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 56 let docsDirect = paths[0] 57 let url = docsDirect.appendingPathComponent("recording.m4a") 58 return url 59 } 60 61 62 @IBAction func play(_ sender: UITapGestureRecognizer) { 63 print("play") 64 if !isPlaying{ 65 audioPlayer = try! AVAudioPlayer(contentsOf: getURL()) 66 audioPlayer.delegate = self 67 audioPlayer.play() 68 isPlaying = true 69 label.text = "再生中" 70 record.isEnabled = false 71 }else{ 72 audioPlayer.stop() 73 isPlaying = false 74 label.text = "待機中" 75 record.isEnabled = true 76 } 77 } 78 79 80} 81 82

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
わかるところだけ。

func record(_ sender: UILongPressGestureRecognizer) {

長押しジェスチャのイベントハンドラ内の実装ですが、
sender.stateプロパティを見て、長押しが始まったタイミング、終了(またはキャンセルされた)タイミングを切り分けてください。

UILongPressGestureRecognizerは長押し中に指を動かしても、ハンドラが呼ばれますので、今のコードではマトモに動作しないはずです。

投稿2019/07/24 08:28

takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問