Files
peko-ios/YuMi/Modules/YMMessage/View/Session/Content/MessageConentAudioView.m
2024-04-11 17:05:27 +08:00

152 lines
4.7 KiB
Objective-C

//
// MessageConentAudioView.m
// YUMI
//
// Created by YUMI on 2022/4/22.
//
#import "MessageConentAudioView.h"
///Third
#import <Masonry/Masonry.h>
#import <NIMSDK/NIMSDK.h>
///Tool
#import "DJDKMIMOMColor.h"
#import "MessageAudioCenter.h"
#import "MessageAudioModel.h"
@interface MessageConentAudioView ()<NIMMediaManagerDelegate>
///背景
@property (nonatomic,strong) UIView * backView;
///显示语音的时长
@property (nonatomic,strong) UILabel *timeLabel;
///显示语音的动画
@property (nonatomic,strong) UIImageView *audioImageView;
///当前的消息
@property (nonatomic,strong) NIMMessage *message;
///是否正在播放
@property (nonatomic,assign) BOOL isPlaying;
@end
@implementation MessageConentAudioView
- (void)dealloc {
[[NIMSDK sharedSDK].mediaManager removeDelegate:self];
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[[NIMSDK sharedSDK].mediaManager setNeedProximityMonitor:NO];
[[NIMSDK sharedSDK].mediaManager addDelegate:self];
[self initSubViews];
[self initSubViewConstraints];
}
return self;
}
#pragma mark - Private Method
- (void)initSubViews {
[self addSubview:self.backView];
[self.backView addSubview:self.timeLabel];
[self.backView addSubview:self.audioImageView];
}
- (void)initSubViewConstraints {
[self.backView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self).insets(UIEdgeInsetsMake(MESSAGE_PADDING, MESSAGE_PADDING, MESSAGE_PADDING, MESSAGE_PADDING));
make.height.mas_equalTo(30);
make.width.mas_equalTo(50);
}];
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.mas_equalTo(self.backView).offset(10);
make.centerY.mas_equalTo(self.backView);
}];
[self.audioImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(20, 20));
make.trailing.mas_equalTo(self.backView).offset(-10);
make.centerY.mas_equalTo(self.backView);
}];
}
#pragma mark - NIMMediaManagerDelegate
- (void)playAudio:(NSString *)filePath didBeganWithError:(NSError *)error {
if(filePath && !error) {
if ([MessageAudioCenter shareInstance].currentPlayingMessage == self.message) {
[self.audioImageView startAnimating];
}
}
}
- (void)playAudio:(NSString *)filePath didCompletedWithError:(NSError *)error {
[self.audioImageView stopAnimating];
UIImage * thirdImage = [UIImage imageNamed:@"message_content_audio_playing_third"];
self.audioImageView.image = thirdImage;
}
#pragma mark - Event Response
- (void)didTapBackRecognizer {
if ([self.message attachmentDownloadState] == NIMMessageAttachmentDownloadStateDownloaded) {
if ([[NIMSDK sharedSDK].mediaManager isPlaying]) {
[[NIMSDK sharedSDK].mediaManager stopPlay];
}
if (self.isPlaying) {
[[NIMSDK sharedSDK].mediaManager stopPlay];
self.isPlaying = NO;
} else {
self.isPlaying = YES;
[[NIMSDK sharedSDK].mediaManager switchAudioOutputDevice:NIMAudioOutputDeviceSpeaker];
[[MessageAudioCenter shareInstance] play:self.message];
}
}
}
#pragma mark - Getters And Setters
- (UIView *)backView {
if (!_backView) {
_backView = [[UIView alloc] init];
_backView.backgroundColor = [UIColor clearColor];
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapBackRecognizer)];
[_backView addGestureRecognizer:tap];
}
return _backView;
}
- (UILabel *)timeLabel {
if (!_timeLabel) {
_timeLabel = [[UILabel alloc] init];
_timeLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium];
_timeLabel.textColor = [DJDKMIMOMColor mainTextColor];
}
return _timeLabel;
}
- (UIImageView *)audioImageView {
if (!_audioImageView) {
_audioImageView = [[UIImageView alloc] init];
_audioImageView.userInteractionEnabled = YES;
UIImage * firstImage = [UIImage imageNamed:@"message_content_audio_playing_first"];
UIImage * secondImage = [UIImage imageNamed:@"message_content_audio_playing_second"];
UIImage * thirdImage = [UIImage imageNamed:@"message_content_audio_playing_third"];
_audioImageView.animationImages = @[firstImage, secondImage, thirdImage];
_audioImageView.animationDuration = 1;
_audioImageView.animationRepeatCount = HUGE;
_audioImageView.image = thirdImage;
}
return _audioImageView;
}
- (void)render:(MessageBaseModel *)model {
self.message = model.message;
NIMAudioObject *audioContent = (NIMAudioObject*)[model.message messageObject];
NSAssert([audioContent isKindOfClass:[NIMAudioObject class]], @"message should be audio");
[self.backView mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(model.contentSize.width);;
}];
self.timeLabel.text = [NSString stringWithFormat:@"%zd\"",(audioContent.duration+500)/1000];//四舍五入
}
@end