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