Swift - 长按按钮上的手势以使用 AVFoundation 录制音频

标签 swift uibutton avfoundation long-press uilongpressgesturerecogni

我正在尝试为我的聊天实现一个录制按钮,只要您按住该按钮,它就会录制。我实现了一个longpressGestureRecognizer,但不幸的是,无论我按多长时间,它都只记录一秒钟。

这是代码:

let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress(_:)))
    longPressGestureRecognizer.minimumPressDuration = 1


    self.recordingSession = AVAudioSession.sharedInstance()

    do {
        try self.recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try self.recordingSession.setActive(true)
        self.recordingSession.requestRecordPermission() { [unowned self] allowed in
            DispatchQueue.main.async {
                if allowed {
                    self.record_button.addGestureRecognizer(longPressGestureRecognizer)
                } else {
                    // failed to record!
                }
            }
        }
    } catch {
        // failed to record!
    }

// Gesture Recognizer for the Record Button, so as long as it is pressed, record!
func longPress(_ longPressGestureRecognizer: UILongPressGestureRecognizer){
    if longPressGestureRecognizer.state == .ended {
        print("long press ended")
        let recordImage = UIImage(named: "ic_mic_white")
        record_button.setImage(recordImage, for: .normal)
        self.recordTapRelease()
    }
    if longPressGestureRecognizer.state == .began {
        let recordingTapImage = UIImage(named: "ic_mic_none_white")
        record_button.setImage(recordingTapImage, for: .normal)
        self.recording()

    }
}

编辑 我实现了 .touchdown .touchupinside 事件等。 我仍然会得到相同的行为,除非我稍微抬起记录按钮上方,留下橙色 View 。然后录制图像按钮图像也会发生变化,显示正在录制,如果我松开并进一步向上移动,它就会停止录制。

Recording button function

最佳答案

您甚至不必创建 UILongPressGestureRecognizer 来实现此目的;您可以通过为 UIButton 实现 touchDowntouchUpInsidetouchDragExit 事件来实现。

乍一看,它似乎比使用 UILongPressGestureRecognizer 更复杂,但我认为它更符合逻辑,甚至更具可读性。

按照 this answer 中的步骤操作希望您能获得录制按钮所需的行为。如果您坚持使用 UILongPressGestureRecognizer,它还有另一个答案。

希望这有帮助。

关于Swift - 长按按钮上的手势以使用 AVFoundation 录制音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592122/

相关文章:

swift - 在 Swift 中触摸任意位置时关闭 iOS 中的键盘

ios - 我怎样才能用 Swift 编程渐变边框颜色 UIButton

ios - 如何使用 AVAssetResourceLoader?

ios - 使用 16 位 PCM 在 iOS 中生成音调,AudioEngine.connect() 抛出 AUSetFormat : error -10868

ios - 将 Assets 放入声音缓冲区

ios - Dateformatter 日期字符串返回 nil

ios - UIBezierPath 上的点或位置

ios - UIButton 奇怪的阴影行为

带有右导航箭头的 iOS 联系人样式按钮

ios - Swift - 在带有部分和源的 TableView 上更新/添加/删除项目