Files
yingmeng-ios-switf/yinmeng-ios/Modules/Home/HomeVoiceRecordView.swift
2024-03-04 14:14:33 +08:00

348 lines
13 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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)
}