163 lines
4.5 KiB
Swift
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)
|
|
}
|
|
}
|
|
}
|
|
}
|