Files
yingmeng-ios-switf/yinmeng-ios/Modules/Chat/View/ChatVoiceCell.swift
2024-03-01 15:39:53 +08:00

163 lines
4.5 KiB
Swift

//
// ChatVoiceCell.swift
// yinmeng-ios
//
// Created by MaiMang on 2024/3/1.
//
import UIKit
import NIMSDK
class ChatVoiceCell: ChatBaseCell, NIMMediaManagerDelegate {
override var model: ChatSessionProtocol? {
didSet {
if let model = model as? ChatVoiceObject {
timeLabel.text = "\(model.duartion / 1000)s"
}
}
}
private lazy var timeLabel: UILabel = {
let label = UILabel()
label.textColor = ThemeColor(hexStr: "#2B2D33")
label.font = UIFont.systemFont(ofSize: 14, weight: .medium)
return label
}()
private lazy var voiceImageView: UIImageView = {
let imageView = UIImageView()
imageView.isUserInteractionEnabled = true
let firstImage = UIImage(named:"chat_audio_playing_first")!
let second = UIImage(named:"chat_audio_playing_second")!
let third = UIImage(named:"chat_audio_playing_third")!
imageView.animationImages = [firstImage, second, third];
imageView.animationDuration = 1
imageView.animationRepeatCount = 100
imageView.image = third
return imageView
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
NIMSDK.shared().mediaManager.setNeedProximityMonitor(false)
NIMSDK.shared().mediaManager.add(self)
loadSubViews()
let tap = UITapGestureRecognizer(target: self, action: #selector(didTapBackRecognizer))
addGestureRecognizer(tap)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
NIMSDK.shared().mediaManager.remove(self)
}
func loadSubViews() {
bubbleView.addSubview(timeLabel)
bubbleView.addSubview(voiceImageView)
timeLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(10)
make.centerY.equalToSuperview()
}
voiceImageView.snp.makeConstraints { make in
make.size.equalTo(CGSize(width: 20, height: 20))
make.centerY.equalToSuperview()
make.right.equalToSuperview().offset(-10)
}
}
func playAudio(_ filePath: String, didBeganWithError error: Error?) {
if filePath.isEmpty || error != nil { return }
voiceImageView.startAnimating()
}
func playAudio(_ filePath: String, didCompletedWithError error: Error?) {
voiceImageView.stopAnimating()
let thirdImage = UIImage(named: "chat_audio_playing_third")
voiceImageView.image = thirdImage
}
@objc func didTapBackRecognizer() {
if NIMSDK.shared().mediaManager.isPlaying() {
NIMSDK.shared().mediaManager.stopPlay()
}
if let path = self.model as? ChatVoiceObject , path.filPath.count > 0{
NIMSDK.shared().mediaManager.play(path.filPath)
}
}
override func layoutMessageCell() {
super.layoutMessageCell()
setupCellLayout()
}
}
extension ChatVoiceCell {
func setupCellLayout() {
guard let model = model else {return}
if model.msg?.isOutgoingMsg == true { //
avatarImgView.snp.remakeConstraints { (make) in
make.size.equalTo(ChatUIConfig.layout.avatarSize)
make.right.equalToSuperview().offset(-10)
make.top.equalToSuperview().offset(ChatUIConfig.layout.cellContentInsets.top)
}
bubbleView.snp.remakeConstraints { make in
make.size.equalTo(model.contentSize)
make.top.equalTo(avatarImgView)
make.right.equalTo(avatarImgView.snp.left).offset(-10)
}
activityIndicatorView.snp.remakeConstraints { (make) in
make.centerY.equalTo(bubbleView)
make.right.equalTo(bubbleView.snp.left)
make.width.height.equalTo(30)
}
timeLabel.snp.remakeConstraints { make in
make.left.equalToSuperview().offset(10)
make.centerY.equalToSuperview()
}
voiceImageView.snp.remakeConstraints { make in
make.size.equalTo(CGSize(width: 20, height: 20))
make.centerY.equalToSuperview()
make.right.equalToSuperview().offset(-10)
}
// start
activityStartAnimating()
}else {
avatarImgView.snp.remakeConstraints { (make) in
make.size.equalTo(ChatUIConfig.layout.avatarSize)
make.left.equalToSuperview().offset(10)
make.top.equalToSuperview().offset(ChatUIConfig.layout.cellContentInsets.top)
}
bubbleView.snp.remakeConstraints { make in
make.size.equalTo(model.contentSize)
make.top.equalTo(avatarImgView)
make.left.equalTo(avatarImgView.snp.right).offset(10)
}
timeLabel.snp.remakeConstraints { make in
make.left.equalToSuperview().offset(10)
make.centerY.equalToSuperview()
}
voiceImageView.snp.remakeConstraints { make in
make.size.equalTo(CGSize(width: 20, height: 20))
make.centerY.equalToSuperview()
make.right.equalToSuperview().offset(-10)
}
}
}
}