157 lines
4.3 KiB
Swift
157 lines
4.3 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)"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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_first")!
|
||
|
let third = UIImage(named:"chat_audio_playing_first")!
|
||
|
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()
|
||
|
}
|
||
|
|
||
|
|
||
|
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)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
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)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|