| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- //
- // JCHATToolBar.m
- // JPush IM
- //
- // Created by Apple on 14/12/26.
- // Copyright (c) 2014年 Apple. All rights reserved.
- //
- #import "JCHATToolBar.h"
- #import "JChatConstants.h"
- #import "JCHATRecordAnimationView.h"
- #import "AppDelegate.h"
- #import <AVFoundation/AVFoundation.h>
- #import "NSString+MessageInputView.h"
- #import "JCHATFileManager.h"
- #import "Masonry.h"
- #import "JCHATAudioPlayerHelper.h"
- #import "JCHATStringUtils.h"
- #import "ViewUtil.h"
- @implementation JCHATToolBar
- - (instancetype)init
- {
- self = [super init];
- if (self) {
-
- }
- return self;
- }
- #pragma mark---加载子view
- - (void)loadSubView {
- //录音按钮
- }
- - (IBAction)faceBtnClick:(UIButton *)sender {
- if (self.delegate && [self.delegate respondsToSelector:@selector(noPressFaceBtnClick:)]) {
- if (self.faceBtn.selected) {
- self.faceBtn.selected = NO;
- [self.delegate noPressFaceBtnClick:sender];
- } else if (self.delegate && [self.delegate respondsToSelector:@selector(pressFaceBtnClick:)]){
- [self.delegate pressFaceBtnClick:sender];
- self.faceBtn.selected=YES;
- }
- }
-
- }
- - (IBAction)addBtnClick:(id)sender {
- if (self.delegate && [self.delegate respondsToSelector:@selector(noPressmoreBtnClick:)]) {
- if (self.addButton.selected) {
- self.addButton.selected = NO;
- [self.delegate noPressmoreBtnClick:sender];
- } else if (self.delegate && [self.delegate respondsToSelector:@selector(pressMoreBtnClick:)]){
- [self.delegate pressMoreBtnClick:sender];
- self.addButton.selected=YES;
- }
- }
- }
- - (IBAction)voiceBtnClick:(id)sender {
- [self switchInputMode];
- }
- - (void)switchInputMode {
- if (self.voiceButton.selected == NO) {
- _textViewHeight.constant = 36;
- [self switchToVoiceInputMode];
- } else {
- [self switchToTextInputMode];
- }
- }
- - (void)switchToVoiceInputMode {
- self.voiceButton.selected = YES;
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_keyboard"] forState:UIControlStateNormal];
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_keyboard"] forState:UIControlStateHighlighted];
- [self.textView setHidden:YES];
- [self.startRecordButton setHidden:NO];
- if (self.delegate && [self.delegate respondsToSelector:@selector(pressVoiceBtnToHideKeyBoard)]) {
- [self.delegate pressVoiceBtnToHideKeyBoard];
- }
- }
- - (void)switchToTextInputMode {
- [self switchToolbarToTextMode];
- JPIMLog(@"startRecordButton is :%@",self.startRecordButton);
- if (self.delegate && [self.delegate respondsToSelector:@selector(switchToTextInputMode)]) {
- [self.delegate switchToTextInputMode];
- }
- }
- - (void)switchToolbarToTextMode {
- self.voiceButton.selected=NO;
- self.voiceButton.contentMode = UIViewContentModeCenter;
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_voice"] forState:UIControlStateNormal];
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_voice"] forState:UIControlStateHighlighted];
- [self.startRecordButton setHidden:YES];
- [self.textView setHidden:NO];
- }
- - (void)layoutSubviews {
- [super layoutSubviews];
- if (self.voiceButton.selected == NO) {
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_voice"] forState:UIControlStateNormal];
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_voice"] forState:UIControlStateHighlighted];
- } else{
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_keyboard"] forState:UIControlStateNormal];
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_keyboard"] forState:UIControlStateHighlighted];
- }
- // [self setBackgroundColor:[UIColor colorWithRed:223/255.0 green:223/255.0 blue:223/255.0 alpha:1]];
- }
- - (void)drawRect:(CGRect)rect {
- if (self.startRecordButton){
- [self.startRecordButton mas_remakeConstraints:^(MASConstraintMaker *make) {
-
- }];
-
- [self.startRecordButton mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self).with.offset(5);
- make.bottom.mas_equalTo(self).with.offset(-4);
- make.left.mas_equalTo(self.voiceButton.mas_right).with.offset(5);
- make.right.mas_equalTo(self.faceBtn.mas_left).with.offset(-5);
- }];
- return;
- }
- self.voiceButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin;
- [self.voiceButton setImage:[UIImage imageNamed:@"chat_voice"] forState:UIControlStateNormal];
- self.textView.delegate = self;
-
- self.textView.returnKeyType = UIReturnKeySend;
- UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick:)];
- [self addGestureRecognizer:gesture];
- [self setFrame:CGRectMake(0, kApplicationHeight + kStatusBarHeight - 45, self.bounds.size.width, 45)];
-
- //self.startRecordButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- self.startRecordButton = [UIButton new];
-
- [self.startRecordButton setTitleColor:RGB_COLOR(@"#969696", 1) forState:UIControlStateNormal];
- [self.startRecordButton setTitleColor: RGB_COLOR(@"#969696", 1) forState:UIControlStateHighlighted];
- [self.startRecordButton setTitle:YZMsg(@"按住 说话") forState:UIControlStateNormal];
- [self.startRecordButton setTitle:YZMsg(@"松开 结束") forState:UIControlStateHighlighted];
- self.startRecordButton.layer.masksToBounds = YES;
- self.startRecordButton.layer.cornerRadius = 5;
- self.startRecordButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin;
- [self.startRecordButton setBackgroundColor:RGB_COLOR(@"#2c2840", 1)];
- [self.startRecordButton addTarget:self action:@selector(holdDownButtonTouchDown) forControlEvents:UIControlEventTouchDown];
- [self.startRecordButton addTarget:self action:@selector(holdDownButtonTouchUpOutside) forControlEvents:UIControlEventTouchUpOutside];
- [self.startRecordButton addTarget:self action:@selector(holdDownButtonTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
- [self.startRecordButton addTarget:self action:@selector(holdDownDragOutside) forControlEvents:UIControlEventTouchDragExit];
- [self.startRecordButton addTarget:self action:@selector(holdDownDragInside) forControlEvents:UIControlEventTouchDragEnter];
- [self.startRecordButton setHidden:YES];
- [self addSubview:self.startRecordButton];
-
- UIWindow *window =(UIWindow *)[UIApplication sharedApplication].keyWindow;
- self.recordAnimationView=[[JCHATRecordAnimationView alloc]initWithFrame:CGRectMake((kApplicationWidth-140)/2, (kScreenHeight -kNavigationBarHeight - kTabBarHeight - 140)/2, 140, 140)];
- [window addSubview:self.recordAnimationView];
- }
- - (void)holdDownButtonTouchDown {
- [self.startRecordButton setBackgroundColor:RGB_COLOR(@"#27233a", 1)];
- if ([self.delegate respondsToSelector:@selector(didStartRecordingVoiceAction)]) {
- [[JCHATAudioPlayerHelper shareInstance] stopAudio];
- [self.delegate didStartRecordingVoiceAction];
- }
- }
- - (void)holdDownButtonTouchUpOutside {
- [self.startRecordButton setBackgroundColor:RGB_COLOR(@"#2c2840", 1)];
- if ([self.delegate respondsToSelector:@selector(didCancelRecordingVoiceAction)]) {
- [self.delegate didCancelRecordingVoiceAction];
- }
- }
- - (void)holdDownButtonTouchUpInside {
- [self.startRecordButton setBackgroundColor:RGB_COLOR(@"#2c2840", 1)];
- if ([self.delegate respondsToSelector:@selector(didFinishRecordingVoiceAction)]) {
- [self.delegate didFinishRecordingVoiceAction];
- }
- }
- - (void)holdDownDragOutside {
- [self.startRecordButton setBackgroundColor:RGB_COLOR(@"#2c2840", 1)];
- if ([self.delegate respondsToSelector:@selector(didDragOutsideAction)]) {
- [self.delegate didDragOutsideAction];
- }
- }
- - (void)holdDownDragInside {
- [self.startRecordButton setBackgroundColor:RGB_COLOR(@"#27233a", 1)];
- if ([self.delegate respondsToSelector:@selector(didDragInsideAction)]) {
- [self.delegate didDragInsideAction];
- }
- }
- - (void)levelMeterChanged:(float)levelMeter{
- [self.recordAnimationView changeanimation:levelMeter];
- }
- #pragma mark - Message input view
- - (void)adjustTextViewHeightBy:(CGFloat)changeInHeight {
- // 动态改变自身的高度和输入框的高度
- CGRect prevFrame = self.textView.frame;
-
- NSUInteger numLines = MAX([self.textView numberOfLinesOfText],
- [self.textView.text numberOfLines]);
-
- if ([_textView.text isEqualToString: @""]) {
- return;
- }
-
- CGSize textSize = [JCHATStringUtils stringSizeWithWidthString:_textView.text withWidthLimit:_textView.frame.size.width withFont:[UIFont systemFontOfSize:st_toolBarTextSize]];
- CGFloat textViewHeight = textSize.height ;//+ 30;
- _textViewHeight.constant = textViewHeight>45?textViewHeight:45;
- // self.textView.contentInset = UIEdgeInsetsMake((numLines >= 6 ? 4.0f : 0.0f),
- // 0.0f,
- // (numLines >= 6 ? 4.0f : 0.0f),
- // 0.0f);
- self.textView.contentInset = UIEdgeInsetsMake(4.0f,
- 0.0f,
- 4.0f,
- 0.0f);
- // from iOS 7, the content size will be accurate only if the scrolling is enabled.
- self.textView.scrollEnabled = YES;
- // if (numLines >= 6) {
- CGPoint bottomOffset = CGPointMake(0.0f, self.textView.contentSize.height - self.textView.bounds.size.height);
- [self.textView setContentOffset:bottomOffset animated:YES];
- [self.textView scrollRangeToVisible:NSMakeRange(self.textView.text.length - 1, 1)];
- // }
- }
- #pragma mark --判断能否录音
- - (BOOL)canRecord
- {
- __block BOOL bCanRecord = YES;
- if (kIOSVersions >= 7.0)
- {
- AVAudioSession *audioSession = [AVAudioSession sharedInstance];
- if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
- [audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
- if (granted) {
- bCanRecord = YES;
- }
- else {
- bCanRecord = NO;
- dispatch_async(dispatch_get_main_queue(), ^{
-
- NSDictionary *contentDic = @{@"title":YZMsg(@"无法录音"),@"msg":YZMsg(@"请在“设置-隐私-麦克风”选项中,允许jpushIM访问你的手机麦克风。"),@"left":@"",@"right":YZMsg(@"确定")};
- [YBAlertView showAlertView:contentDic complete:^(int eventType) {
-
- }];
- });
- }
- }];
- }
- } else{
- bCanRecord = YES;
- }
- return bCanRecord;
- }
- - (void)tapClick:(UIGestureRecognizer *)gesture
- {
- [self.textView resignFirstResponder];
- }
- #pragma mark -
- #pragma mark RecordingDelegate
- - (void)recordingFinishedWithFileName:(NSString *)filePath time:(NSTimeInterval)interval
- {
- JPIMLog(@"录音完成,文件路径:%@",filePath);
- if (interval < 0.50) {
- [JCHATFileManager deleteFile:filePath];
- return;
- }
- dispatch_async(dispatch_get_main_queue(), ^{
- NSRange range = [filePath rangeOfString:@"spx"];
- if (range.length > 0) {
- if (self.delegate && [self.delegate respondsToSelector:@selector(playVoice:time:)]) {
- [self.delegate playVoice:filePath time:[NSString stringWithFormat:@"%.f",ceilf(interval)]];
- }
- }
- });
- }
- - (void)recordingTimeout
- {
- [self.recordAnimationView stopAnimation];
- self.isRecording = NO;
- }
- - (void)recordingStopped //录音机停止采集声音
- {
- self.isRecording = NO;
-
- }
- - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
- {
- if ([text isEqualToString:@"\n"]) {
- if (self.delegate && [self.delegate respondsToSelector:@selector(sendText:)]) {
- [self.delegate sendText:textView.text];
- }
- textView.text=@"";
- return NO;
- }
- return YES;
- }
- #pragma mark - Text view delegate
- - (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
- if ([self.delegate respondsToSelector:@selector(inputTextViewWillBeginEditing:)]) {
- [self.delegate inputTextViewWillBeginEditing:self.textView];
- }
- return YES;
- }
- - (void)textViewDidBeginEditing:(UITextView *)textView {
- [textView becomeFirstResponder];
- if ([self.delegate respondsToSelector:@selector(inputTextViewDidBeginEditing:)]) {
- [self.delegate inputTextViewDidBeginEditing:self.textView];
- }
- }
- - (void)textViewDidEndEditing:(UITextView *)textView
- {
- if ([self.delegate respondsToSelector:@selector(inputTextViewDidEndEditing:)]) {
- [self.delegate inputTextViewDidEndEditing:self.textView];
- }
- }
- - (void)textViewDidChange:(UITextView *)textView {
- if ([self.delegate respondsToSelector:@selector(inputTextViewDidChange:)]) {
- [self.delegate inputTextViewDidChange:self.textView];
- }
- }
- + (CGFloat)textViewLineHeight {
- return st_toolBarTextSize * [UIScreen mainScreen].scale; // for fontSize 16.0f
- }
- + (CGFloat)maxLines {
- return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) ? 3.0f : 8.0f;
- }
- + (CGFloat)maxHeight {
- return ([JCHATToolBar maxLines] + 1.0f) * [JCHATToolBar textViewLineHeight];
- }
- - (void)dealloc{
- [[NSNotificationCenter defaultCenter] removeObserver:self
- name:UIKeyboardWillShowNotification
- object:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self
- name:UIKeyboardWillHideNotification
- object:nil];
- _textView = nil;
- }
- - (void)awakeFromNib {
- [super awakeFromNib];
- self.textView.textContainer.maximumNumberOfLines = 1;
- self.textView.textContainer.lineBreakMode = NSLineBreakByTruncatingHead;
- self.textView.selectable = YES;
-
- }
- @end
- @implementation JCHATToolBarContainer
- - (id)initWithCoder:(NSCoder *)aDecoder {
- self = [super initWithCoder:aDecoder];
- if (self) {
- }
- return self;
- }
- - (void)awakeFromNib {
- [super awakeFromNib];
- _toolbar = NIB(JCHATToolBar);
- _toolbar.backgroundColor = RGB_COLOR(@"#201c36", 1);
- _toolbar.textView.backgroundColor = RGB_COLOR(@"#2c2840", 1);
- _toolbar.textView.placeHolder = YZMsg(@"发送消息...");
- _toolbar.textView.placeHolderTextColor = RGB_COLOR(@"#969696", 1);
- _toolbar.textView.textColor = RGB_COLOR(@"#969696", 1);
- self.backgroundColor = UIColor.clearColor;
- [self performSelector:@selector(addtoolbar) withObject:nil afterDelay:0.02];
- }
- - (void)addtoolbar {
- self.toolbar.frame = CGRectMake(0, 0, kApplicationWidth, 45);
- [self addSubview:_toolbar];
- }
- @end
|