// // YOUPAINIMInputToolBar.m // NIMKit // // Created by chris // Copyright (c) 2015年 NetEase. All rights reserved. // #import "YOUPAINIMInputToolBar.h" #import "YOUPAINIMGrowingTextView.h" #import "UIView+NIM.h" #import "UIImage+NIMKit.h" #import "NIMInputBarItemType.h" #define leftSpacing 15.0 @interface YOUPAINIMInputToolBar() @property (nonatomic,copy) NSArray *types; @property (nonatomic,copy) NSDictionary *dict; @property (nonatomic,strong) YOUPAINIMGrowingTextView *inputTextView; @property (nonatomic,assign) NIMInputStatus status; @end @implementation YOUPAINIMInputToolBar - (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { [self setBackgroundColor:[UIColor whiteColor]]; _inputTextView = [[YOUPAINIMGrowingTextView alloc] initWithFrame:CGRectZero]; _inputTextView.font = [UIFont systemFontOfSize:14.0f]; _inputTextView.maxNumberOfLines = 4; _inputTextView.minNumberOfLines = 1; _inputTextView.textColor = LZ273145Color; _inputTextView.backgroundColor = LZF7F8FAColor; _inputTextView.layer.cornerRadius = 16.75f; _inputTextView.nim_size = [_inputTextView intrinsicContentSize]; _inputTextView.textViewDelegate = self; _inputTextView.returnKeyType = UIReturnKeySend; self.types = @[ @(NIMInputBarItemTypeVoice), @(NIMInputBarItemTypeTextAndRecord), @(NIMInputBarItemTypeEmoticon), @(NIMInputBarItemTypeMore), ]; //修改inputview 按钮 注释 by leo self.recordBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.recordBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_record"] forState:UIControlStateNormal]; [self.recordBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_record"] forState:UIControlStateSelected]; [self.recordBtn sizeToFit]; // self.cameraBtn = [UIButton buttonWithType:UIButtonTypeCustom]; // [self.cameraBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_camera"] forState:UIControlStateNormal]; // [self.cameraBtn sizeToFit]; self.sayHiBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.sayHiBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_sayhi"] forState:UIControlStateNormal]; [self.sayHiBtn sizeToFit]; self.photoBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.photoBtn setImage:[UIImage imageNamed:@"vqu_images_IM_photo"] forState:UIControlStateNormal]; [self.photoBtn sizeToFit]; self.emoticonBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.emoticonBtn setImage:[UIImage imageNamed:@"vqu_images_IM_emoji"] forState:UIControlStateNormal]; [self.emoticonBtn setImage:[UIImage imageNamed:@"vqu_images_IM_emoji"] forState:UIControlStateSelected]; [self.emoticonBtn sizeToFit]; self.giftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.giftBtn setImage:[UIImage imageNamed:@"vqu_images_IM_gift"] forState:UIControlStateNormal]; [self.giftBtn sizeToFit]; self.videoBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.videoBtn setImage:[UIImage imageNamed:@"vqu_images_IM_video1"] forState:UIControlStateNormal]; [self.videoBtn sizeToFit]; [self addSubview:_inputTextView]; [self addSubview:self.recordBtn]; // [self addSubview:self.cameraBtn]; [self addSubview:self.sayHiBtn]; [self addSubview:self.photoBtn]; [self addSubview:self.emoticonBtn]; [self addSubview:self.giftBtn]; [self addSubview:self.videoBtn]; } return self; } - (void)setInputBarItemTypes:(NSArray *)types{ self.types = types; [self setNeedsLayout]; } - (NSString *)contentText { return self.inputTextView.text; } - (void)setContentText:(NSString *)contentText { self.inputTextView.text = contentText; } - (NSArray *)inputBarItemTypes { return self.types; } - (CGSize)sizeThatFits:(CGSize)size { CGFloat viewHeight = 0.0f; if (self.status == NIMInputStatusAudio) { viewHeight = 70; }else{ //算出 TextView 的宽度 [self adjustTextViewWidth:size.width]; // TextView 自适应高度 if([NSThread isMainThread]){ [self.inputTextView layoutIfNeeded]; }else{ dispatch_async(dispatch_get_main_queue(),^{ [self.inputTextView layoutIfNeeded]; }); } viewHeight = self.inputTextView.frame.size.height; //得到 ToolBar 自身高度 viewHeight = viewHeight +44+10; // viewHeight = 84; } return CGSizeMake(size.width,viewHeight); } - (void)adjustTextViewWidth:(CGFloat)width { // CGFloat textViewWidth = 0; // for (NSNumber *type in self.types) { // if (type.integerValue == NIMInputBarItemTypeTextAndRecord) { // continue; // } // UIView *view = [self subViewForType:type.integerValue]; // textViewWidth += view.nim_width; // } // textViewWidth += (self.spacing * (self.types.count + 1)); self.inputTextView.nim_width = self.nim_width - (leftSpacing + 5.0f + 23.0f) * 2; } - (void)layoutSubviews{ [super layoutSubviews]; CGFloat bottomGap = -16; CGFloat size = 23.0f;//35; [_inputTextView makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.recordBtn.mas_right).mas_equalTo(5.0f); make.top.mas_equalTo(5); make.bottom.mas_equalTo(-(5+44)); make.right.equalTo(self.emoticonBtn.mas_left).mas_equalTo(-5.0f); }]; [self.recordBtn makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(leftSpacing); make.centerY.mas_equalTo(self->_inputTextView); make.size.mas_equalTo(CGSizeMake(size, size)); }]; [self.emoticonBtn makeConstraints:^(MASConstraintMaker *make) { make.right.offset(-leftSpacing); make.centerY.mas_equalTo(self->_inputTextView); make.size.mas_equalTo(CGSizeMake(size, size)); }]; NSArray *footBtns = @[self.photoBtn,self.videoBtn,self.giftBtn,self.sayHiBtn]; CGFloat midSpacing = (self.nim_width - (size * footBtns.count)) / footBtns.count; [footBtns mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:midSpacing leadSpacing:midSpacing / 2 tailSpacing:midSpacing / 2]; [footBtns mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.offset(bottomGap); make.height.offset(size); }]; // [self.cameraBtn makeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.recordBtn.right).offset(midSpacing); // make.bottom.mas_equalTo(bottomGap); // make.size.mas_equalTo(CGSizeMake(size, size)); // }]; // [self.photoBtn makeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.cameraBtn.right).offset(midSpacing); // make.bottom.mas_equalTo(bottomGap); // make.size.mas_equalTo(CGSizeMake(size, size)); // }]; // // [self.giftBtn makeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.emoticonBtn.right).offset(midSpacing); // make.bottom.mas_equalTo(bottomGap); // make.size.mas_equalTo(CGSizeMake(size, size)); // }]; // [self.videoBtn makeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.giftBtn.right).offset(midSpacing); // make.bottom.mas_equalTo(bottomGap); // make.size.mas_equalTo(CGSizeMake(size, size)); // }]; // [self.superview layoutIfNeeded]; // [LCTools clipCorner:UIRectCornerTopLeft|UIRectCornerTopRight View:self size:CGSizeMake(20.0f, 20.0f)]; } - (void)adjustTextAndRecordView { // if ([self.types containsObject:@(NIMInputBarItemTypeTextAndRecord)]) // { // self.inputTextView.center = self.inputTextBkgImage.center; // // if (!self.inputTextView.superview) // { // //输入框 // [self addSubview:self.inputTextView]; // } // if (!self.recordButton.superview) // { // //中间点击录音按钮 // self.recordButton.frame = self.inputTextBkgImage.frame; // [self addSubview:self.recordButton]; // } // } } - (BOOL)showsKeyboard { return [self.inputTextView isFirstResponder]; } - (void)setShowsKeyboard:(BOOL)showsKeyboard { if (showsKeyboard) { [self.inputTextView becomeFirstResponder]; } else { [self.inputTextView resignFirstResponder]; } } - (void)update:(NIMInputStatus)status { self.status = status; [self sizeToFit]; if (status == NIMInputStatusText || status == NIMInputStatusMore) { [self.recordButton setHidden:YES]; [self.inputTextView setHidden:NO]; [self.inputTextBkgImage setHidden:NO]; [self updateVoiceBtnImages:YES]; [self updateEmotAndTextBtnImages:YES]; } else if(status == NIMInputStatusAudio) { [self.recordButton setHidden:NO]; [self.inputTextView setHidden:YES]; [self.inputTextBkgImage setHidden:YES]; [self updateVoiceBtnImages:NO]; [self updateEmotAndTextBtnImages:YES]; } else { [self.recordButton setHidden:YES]; [self.inputTextView setHidden:NO]; [self.inputTextBkgImage setHidden:NO]; [self updateVoiceBtnImages:YES]; [self updateEmotAndTextBtnImages:NO]; } } - (void)updateVoiceBtnImages:(BOOL)selected { // [self.voiceBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_voice"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateNormal]; // [self.voiceBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_voice"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateHighlighted]; } - (void)updateEmotAndTextBtnImages:(BOOL)selected { // [self.emoticonBtn setImage:selected?[UIImage imageNamed:@"im_emoji"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateNormal]; // [self.emoticonBtn setImage:selected?[UIImage imageNamed:@"im_emoji"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateHighlighted]; } #pragma mark - NIMGrowingTextViewDelegate - (BOOL)youpaifshouldChangeTextInRange:(NSRange)range replacementText:(NSString *)replacementText { BOOL should = YES; if ([self.delegate respondsToSelector:@selector(youpaifshouldChangeTextInRange:replacementText:)]) { should = [self.delegate youpaifshouldChangeTextInRange:range replacementText:replacementText]; } return should; } - (BOOL)textViewShouldBeginEditing:(YOUPAINIMGrowingTextView *)growingTextView { BOOL should = YES; if ([self.delegate respondsToSelector:@selector(textViewShouldBeginEditing)]) { should = [self.delegate textViewShouldBeginEditing]; } return should; } - (void)textViewDidEndEditing:(YOUPAINIMGrowingTextView *)growingTextView { if ([self.delegate respondsToSelector:@selector(textViewDidEndEditing)]) { [self.delegate textViewDidEndEditing]; } } - (void)textViewDidChange:(YOUPAINIMGrowingTextView *)growingTextView { if ([self.delegate respondsToSelector:@selector(textViewDidChange)]) { [self.delegate textViewDidChange]; } } - (void)youpaifwillChangeHeight:(CGFloat)height { CGFloat toolBarHeight = height + 10+44; if ([self.delegate respondsToSelector:@selector(youpaiftoolBarWillChangeHeight:)]) { [self.delegate youpaiftoolBarWillChangeHeight:toolBarHeight]; } } - (void)youpaifdidChangeHeight:(CGFloat)height { self.nim_height = height + 10+44; if ([self.delegate respondsToSelector:@selector(youpaiftoolBarDidChangeHeight:)]) { [self.delegate youpaiftoolBarDidChangeHeight:self.nim_height]; } } #pragma mark - Get - (UIView *)subViewForType:(NIMInputBarItemType)type{ if (!_dict) { _dict = @{ @(NIMInputBarItemTypeVoice) : self.voiceBtn, @(NIMInputBarItemTypeTextAndRecord) : self.inputTextBkgImage, @(NIMInputBarItemTypeEmoticon) : self.emoticonBtn, @(NIMInputBarItemTypeMore) : self.moreMediaBtn }; } return _dict[@(type)]; } - (CGFloat)spacing{ return 0.f; } - (CGFloat)textViewPadding { return 0.f; } @end @implementation YOUPAINIMInputToolBar(InputText) - (NSRange)selectedRange { return self.inputTextView.selectedRange; } - (void)setPlaceHolder:(NSString *)placeHolder { NSString* str ; if(placeHolder){ str = placeHolder; }else{ str = @""; } self.inputTextView.placeholderAttributedText = [[NSAttributedString alloc] initWithString:str attributes:@{NSForegroundColorAttributeName:[UIColor lightGrayColor],NSFontAttributeName:[UIFont systemFontOfSize:14]}]; } - (void)insertText:(NSString *)text { NSRange range = self.inputTextView.selectedRange; NSString *replaceText = [self.inputTextView.text stringByReplacingCharactersInRange:range withString:text]; range = NSMakeRange(range.location + text.length, 0); self.inputTextView.text = replaceText; self.inputTextView.selectedRange = range; } - (void)deleteText:(NSRange)range { NSString *text = self.contentText; if (range.location + range.length <= [text length] && range.location != NSNotFound && range.length != 0) { NSString *newText = [text stringByReplacingCharactersInRange:range withString:@""]; NSRange newSelectRange = NSMakeRange(range.location, 0); [self.inputTextView setText:newText]; self.inputTextView.selectedRange = newSelectRange; } } @end