我正在使用JSQMessagesViewController来实现聊天。我添加了一个录制按钮,想要通过按下该按钮来发送音频消息,以通过释放按钮来录制和停止录制。 目前我正试图这样做:
record_button = UIButton(type: UIButtonType.custom)
record_button.tintColor = UIColor.white
record_button.setImage(recordImage, for: .normal)
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.addTarget(self, action: #selector(ChatViewController.recording), for: .touchDown )
self.record_button.addTarget(self, action: #selector(ChatViewController.recordTapRelease), for: .touchUpInside)
self.record_button.addTarget(self, action: #selector(ChatViewController.recordTapRelease), for: .touchDragExit)
} else {
// failed to record!
}
}
}
} catch {
// failed to record!
}
不幸的是它无法正常工作。只有当我按下按钮向上移动触摸时它才有效。只有这样它才能识别保持事件和记录。当我触摸并按住相同的位置时,它不会记录,当我松开触摸时,它会发送1秒的音频消息。
修改 我意识到问题是我的Collectionview有一个ScrollView。 scrollview延迟了触地事件以检查用户是否滚动。我怎么应该触发触地事件呢?
答案 0 :(得分:0)
好吧,你可以使用手势识别器。
let gesture = UILongPressGestureRecognizer(target: self, action: #selector(longTouched))
button.addGestureRecognizer(gesture)
func longTouched(gesture: UIGestureRecognizer) {
if gesture.state == .began {
//triggered after long pressed
}else if gesture.state == .ended || gesture.state == .cancelled {
//end of the touch
}
}
如果您需要检测触摸的开始,您还可以向按钮添加UITapGestureRecognizer。 在这种情况下,您可能希望:
tapGesture.numberOfTapsRequired = 1