348 lines
13 KiB
Swift
348 lines
13 KiB
Swift
//
|
||
// HomeVoiceRecordView.swift
|
||
// yinmeng-ios
|
||
//
|
||
// Created by duoban on 2024/3/1.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
class HomeVoiceRecordView: UIView,UITextViewDelegate {
|
||
var myModel:HomeVoiceModel?
|
||
deinit{
|
||
if (self.timer != nil){
|
||
self.timer?.invalidate()
|
||
self.timer = nil
|
||
}
|
||
}
|
||
override init(frame: CGRect) {
|
||
super.init(frame: frame)
|
||
setUILayout()
|
||
|
||
}
|
||
func setUILayout(){
|
||
backgroundColor = UIColor.init(white: 0, alpha: 0.8)
|
||
addSubview(backgroundView)
|
||
backgroundView.addSubview(titleView)
|
||
backgroundView.addSubview(backBtn)
|
||
backgroundView.addSubview(playBtn)
|
||
backgroundView.addSubview(recordBtnView)
|
||
backgroundView.addSubview(resetBtn)
|
||
backgroundView.addSubview(bgSignatureView)
|
||
bgSignatureView.addSubview(signatureView)
|
||
bgSignatureView.addSubview(placeholdView)
|
||
backgroundView.addSubview(publishBtn)
|
||
signatureView.delegate = self
|
||
backgroundView.snp.makeConstraints { make in
|
||
make.width.equalTo(319)
|
||
make.height.equalTo(332)
|
||
make.center.equalTo(self)
|
||
}
|
||
titleView.snp.makeConstraints { make in
|
||
make.top.equalTo(20)
|
||
make.centerX.equalTo(self)
|
||
}
|
||
backBtn.snp.makeConstraints { make in
|
||
make.width.height.equalTo(30)
|
||
make.right.equalTo(-18)
|
||
make.centerY.equalTo(self.titleView)
|
||
}
|
||
recordBtnView.snp.makeConstraints { make in
|
||
make.top.equalTo(self.titleView.snp.bottom).offset(20)
|
||
make.width.equalTo(68)
|
||
make.height.equalTo(68)
|
||
make.centerX.equalTo(self)
|
||
}
|
||
playBtn.snp.makeConstraints { make in
|
||
make.height.width.equalTo(44)
|
||
make.right.equalTo(self.recordBtnView.snp.left).offset(-26)
|
||
make.centerY.equalTo(self.recordBtnView)
|
||
}
|
||
resetBtn.snp.makeConstraints { make in
|
||
make.height.width.equalTo(44)
|
||
make.left.equalTo(self.recordBtnView.snp.right).offset(26)
|
||
make.centerY.equalTo(self.recordBtnView)
|
||
}
|
||
bgSignatureView.snp.makeConstraints { make in
|
||
make.top.equalTo(self.recordBtnView.snp.bottom).offset(16)
|
||
make.width.equalTo(271)
|
||
make.height.equalTo(96)
|
||
make.centerX.equalTo(self)
|
||
}
|
||
signatureView.snp.makeConstraints { make in
|
||
make.edges.equalTo(self.bgSignatureView).inset(12)
|
||
}
|
||
placeholdView.snp.makeConstraints { make in
|
||
make.left.top.equalTo(14)
|
||
}
|
||
publishBtn.snp.makeConstraints { make in
|
||
make.width.equalTo(271)
|
||
make.height.equalTo(46)
|
||
make.centerX.equalTo(self)
|
||
make.top.equalTo(bgSignatureView.snp.bottom).offset(20)
|
||
}
|
||
|
||
let recordVoiceTap = UILongPressGestureRecognizer.init(target: self, action: #selector(recordVoiceAction(sender:)))
|
||
recordBtnView.addGestureRecognizer(recordVoiceTap)
|
||
let tap = UITapGestureRecognizer.init(target: self, action: #selector(stopRecordVoiceTap(sender:)))
|
||
recordBtnView.addGestureRecognizer(tap)
|
||
activityView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
|
||
activityView.center = center
|
||
activityView.startAnimating()
|
||
|
||
}
|
||
|
||
@objc func stopRecordVoiceTap(sender:UITapGestureRecognizer){
|
||
if self.recordBtnView.type == 0 || self.recordBtnView.type == 2{return}
|
||
finishRecordVoice()
|
||
}
|
||
|
||
@objc func recordVoiceAction(sender:UILongPressGestureRecognizer){
|
||
if self.recordBtnView.type != 0 {return}
|
||
AVAudioSession.sharedInstance().requestRecordPermission { isHave in
|
||
if isHave == false{
|
||
HUDTool.show(with: "没有麦克风权限,请到设置中打开麦克风权限")
|
||
return
|
||
}
|
||
if Thread.current.isMainThread {
|
||
self.beginRecordVoice()
|
||
} else {
|
||
// 切换到 main 线程,处理
|
||
DispatchQueue.main.async {
|
||
self.beginRecordVoice()
|
||
return
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
}
|
||
func beginRecordVoice(){
|
||
|
||
|
||
recorder.initWithRecord()
|
||
beginTimer()
|
||
|
||
}
|
||
func beginTimer(){
|
||
if (self.timer != nil){return}
|
||
self.time = 0
|
||
|
||
self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {[weak self] timer in
|
||
self?.time = (self?.time ?? 0) + 1
|
||
if self?.recordBtnView.type != 1 {
|
||
self?.recordBtnView.type = 1
|
||
}
|
||
if (self?.time ?? 0 > 15){
|
||
self?.finishRecordVoice()
|
||
}else{
|
||
if let time = self?.time{
|
||
self?.recordBtnView.recordTextView.text = "\(time)\'s"
|
||
}
|
||
|
||
}
|
||
|
||
})
|
||
}
|
||
func finishRecordVoice(){
|
||
self.recordBtnView.type = 2
|
||
if (self.timer != nil){
|
||
self.timer?.invalidate()
|
||
self.timer = nil
|
||
}
|
||
recorder.stopRecord()
|
||
if self.time < 3 {
|
||
self.recordBtnView.type = 0
|
||
HUDTool.show(with: "录制的语音至少3s")
|
||
if FileManager.default.isDeletableFile(atPath: self.recorder.path){
|
||
try? FileManager.default.removeItem(atPath: self.recorder.path)
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
@objc func backBtnAction(){
|
||
self.removeFromSuperview()
|
||
}
|
||
@objc func playBtnAction(){
|
||
if self.recordBtnView.type == 0{
|
||
HUDTool.show(with: "请先录制声音")
|
||
return
|
||
}
|
||
if self.recordBtnView.type == 1{
|
||
HUDTool.show(with: "正在录制声音,请先结束录制")
|
||
return
|
||
}
|
||
self.playBtn.isSelected = !self.playBtn.isSelected
|
||
self.recorder.playFilePathVoice()
|
||
}
|
||
func textViewDidChange(_ textView: UITextView) {
|
||
if textView.text.count > 0{
|
||
placeholdView.isHidden = true
|
||
}else{
|
||
placeholdView.isHidden = false
|
||
}
|
||
|
||
|
||
}
|
||
@objc func publishBtnAction(){
|
||
self.addSubview(self.activityView)
|
||
RequestGet(path: "qiniu/upload/getUploadToken", parma: [:]) { data in
|
||
|
||
if let _data = data as? [String:Any] {
|
||
if let getKey = _data["key"] as? String, let getToken = _data["token"] as? String{
|
||
let config = QNConfiguration.build { builder in
|
||
let zone = QNFixedZone.create(withRegionId: "z2")
|
||
builder?.setZone(zone)
|
||
}
|
||
let manager = QNUploadManager.init(configuration: config)
|
||
manager?.putFile(self.recorder.path, key: getKey , token: getToken, complete: { info, key, res in
|
||
let gender = self.myModel?.gender == 1 ? "1" : "2"
|
||
let desc = self.signatureView.text.count == 0 ? "这个人很懒还没有签名" : self.signatureView.text
|
||
|
||
let dura = "\(self.time)"
|
||
let url = self.recorder.path
|
||
RequestPost(path: "voiceShow/publish", parma: ["gender":gender,"desc":desc ?? "","dura":dura,"url":url]) { data in
|
||
if Thread.current.isMainThread {
|
||
self.activityView.removeFromSuperview()
|
||
HUDTool.show(with: "发布成功")
|
||
self.removeFromSuperview()
|
||
} else {
|
||
// 切换到 main 线程,处理
|
||
DispatchQueue.main.async {
|
||
self.activityView.removeFromSuperview()
|
||
HUDTool.show(with: "发布成功")
|
||
self.removeFromSuperview()
|
||
}
|
||
}
|
||
|
||
|
||
} fail: { code, data in
|
||
if Thread.current.isMainThread {
|
||
self.activityView.removeFromSuperview()
|
||
HUDTool.show(with: data)
|
||
} else {
|
||
// 切换到 main 线程,处理
|
||
DispatchQueue.main.async {
|
||
self.activityView.removeFromSuperview()
|
||
HUDTool.show(with: data)
|
||
}
|
||
}
|
||
|
||
}
|
||
}, option: nil)
|
||
}
|
||
|
||
|
||
}
|
||
} fail: { code, data in
|
||
self.activityView.removeFromSuperview()
|
||
}
|
||
|
||
}
|
||
@objc func resetBtnAction(){
|
||
if self.recordBtnView.type == 0{
|
||
HUDTool.show(with: "请先录制声音")
|
||
return
|
||
}
|
||
if PlayVoiceManager.shared.isPlay{
|
||
HUDTool.show(with: "正在播放声音,请先结束播放")
|
||
return
|
||
}
|
||
if (self.timer != nil){
|
||
self.timer?.invalidate()
|
||
self.timer = nil
|
||
}
|
||
self.time = 0
|
||
recorder.stopRecord()
|
||
if FileManager.default.isDeletableFile(atPath: self.recorder.path){
|
||
try? FileManager.default.removeItem(atPath: self.recorder.path)
|
||
}
|
||
self.recordBtnView.type = 0
|
||
}
|
||
|
||
var backgroundView:UIView = {
|
||
let _backgroundView = UIView()
|
||
_backgroundView.backgroundColor = ThemeColor(hexStr: "#525566", alpha: 0.8)
|
||
_backgroundView.layer.cornerRadius = 16
|
||
_backgroundView.layer.masksToBounds = true
|
||
|
||
return _backgroundView
|
||
}()
|
||
|
||
var titleView:UILabel = {
|
||
let _titleView = UILabel()
|
||
_titleView.font = UIFont.systemFont(ofSize: 16, weight: .medium)
|
||
_titleView.textColor = .white
|
||
_titleView.textAlignment = .center
|
||
_titleView.text = "发布专属声音秀"
|
||
return _titleView
|
||
}()
|
||
var backBtn:UIButton = {
|
||
let _backBtn = UIButton()
|
||
_backBtn.setImage(UIImage(named: "yin_home_voice_record_back"), for: .normal)
|
||
_backBtn.addTarget(self, action: #selector(backBtnAction), for: .touchUpInside)
|
||
return _backBtn
|
||
}()
|
||
var playBtn:UIButton = {
|
||
let _playBtn = UIButton()
|
||
_playBtn.setImage(UIImage(named: "yin_hoem_voice_record_play"), for: .selected)
|
||
_playBtn.setImage(UIImage(named: "yin_hoem_voice_record_no_play"), for: .normal)
|
||
_playBtn.addTarget(self, action: #selector(playBtnAction), for: .touchUpInside)
|
||
return _playBtn
|
||
}()
|
||
var resetBtn:UIButton = {
|
||
let _resetBtn = UIButton()
|
||
_resetBtn.setImage(UIImage(named: "yin_hoem_voice_record_reset"), for: .normal)
|
||
_resetBtn.addTarget(self, action: #selector(resetBtnAction), for: .touchUpInside)
|
||
return _resetBtn
|
||
}()
|
||
var recordBtnView:HomeVoiceRecordBtnView = {
|
||
let _recordBtnView = HomeVoiceRecordBtnView(frame: .zero)
|
||
return _recordBtnView
|
||
}()
|
||
|
||
var bgSignatureView:UIView = {
|
||
let _bgSignatureView = UIView()
|
||
_bgSignatureView.backgroundColor = ThemeColor(hexStr: "#DCDDE0")
|
||
_bgSignatureView.layer.cornerRadius = 11
|
||
_bgSignatureView.layer.masksToBounds = true
|
||
return _bgSignatureView
|
||
}()
|
||
var signatureView:UITextView = {
|
||
let signatureView = UITextView()
|
||
signatureView.text = ""
|
||
signatureView.textColor = ThemeColor(hexStr: "#7D8499")
|
||
signatureView.font = UIFont.systemFont(ofSize: 13, weight: .regular)
|
||
|
||
signatureView.backgroundColor = .clear
|
||
return signatureView
|
||
}()
|
||
var placeholdView:UILabel = {
|
||
let _placeholdView = UILabel()
|
||
_placeholdView .text = "说点什么…"
|
||
_placeholdView .textColor = ThemeColor(hexStr: "#7D8499")
|
||
_placeholdView .font = UIFont.systemFont(ofSize: 13, weight: .regular)
|
||
return _placeholdView
|
||
}()
|
||
var publishBtn:UIButton = {
|
||
let _publishBtn = UIButton()
|
||
|
||
_publishBtn.setBackgroundImage(UIImage(named: "yin_hoem_voice_record_publish_btn"), for: .normal)
|
||
_publishBtn.setTitle("发布", for: .normal)
|
||
_publishBtn.setTitleColor(.white, for: .normal)
|
||
_publishBtn.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .semibold)
|
||
_publishBtn.addTarget(self, action: #selector(publishBtnAction), for: .touchUpInside)
|
||
return _publishBtn
|
||
}()
|
||
var time:Int = 0
|
||
var timer:Timer?
|
||
var recorder:RecordVoiceManager = RecordVoiceManager()
|
||
let activityView:UIActivityIndicatorView = UIActivityIndicatorView(style: .medium)
|
||
}
|