Swift - 按钮上的LongPress手势用AVFoundation录制音频

时间:2016-11-14 15:20:27

标签: 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事件等。 我仍然会得到相同的行为,除非我略微高于记录按钮而离开橙色视图。然后录制图像按钮图像也会改变,显示录制,如果我释放并进一步向上移动则停止录制。

Recording button function

1 个答案:

答案 0 :(得分:0)

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

初看起来,它似乎比使用UILongPressGestureRecognizer更复杂,但我认为它更合乎逻辑,更具可读性。

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

希望这会有所帮助。