YOUPAINIMInputToolBar.m 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. //
  2. // YOUPAINIMInputToolBar.m
  3. // NIMKit
  4. //
  5. // Created by chris
  6. // Copyright (c) 2015年 NetEase. All rights reserved.
  7. //
  8. #import "YOUPAINIMInputToolBar.h"
  9. #import "YOUPAINIMGrowingTextView.h"
  10. #import "UIView+NIM.h"
  11. #import "UIImage+NIMKit.h"
  12. #import "NIMInputBarItemType.h"
  13. #define leftSpacing 15.0
  14. @interface YOUPAINIMInputToolBar()<NIMGrowingTextViewDelegate>
  15. @property (nonatomic,copy) NSArray<NSNumber *> *types;
  16. @property (nonatomic,copy) NSDictionary *dict;
  17. @property (nonatomic,strong) YOUPAINIMGrowingTextView *inputTextView;
  18. @property (nonatomic,assign) NIMInputStatus status;
  19. @end
  20. @implementation YOUPAINIMInputToolBar
  21. - (instancetype)initWithFrame:(CGRect)frame{
  22. self = [super initWithFrame:frame];
  23. if (self) {
  24. [self setBackgroundColor:[UIColor whiteColor]];
  25. _inputTextView = [[YOUPAINIMGrowingTextView alloc] initWithFrame:CGRectZero];
  26. _inputTextView.font = [UIFont systemFontOfSize:14.0f];
  27. _inputTextView.maxNumberOfLines = 4;
  28. _inputTextView.minNumberOfLines = 1;
  29. _inputTextView.textColor = LZ273145Color;
  30. _inputTextView.backgroundColor = LZF7F8FAColor;
  31. _inputTextView.layer.cornerRadius = 16.75f;
  32. _inputTextView.nim_size = [_inputTextView intrinsicContentSize];
  33. _inputTextView.textViewDelegate = self;
  34. _inputTextView.returnKeyType = UIReturnKeySend;
  35. self.types = @[
  36. @(NIMInputBarItemTypeVoice),
  37. @(NIMInputBarItemTypeTextAndRecord),
  38. @(NIMInputBarItemTypeEmoticon),
  39. @(NIMInputBarItemTypeMore),
  40. ];
  41. //修改inputview 按钮 注释 by leo
  42. self.recordBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  43. [self.recordBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_record"] forState:UIControlStateNormal];
  44. [self.recordBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_record"] forState:UIControlStateSelected];
  45. [self.recordBtn sizeToFit];
  46. // self.cameraBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  47. // [self.cameraBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_camera"] forState:UIControlStateNormal];
  48. // [self.cameraBtn sizeToFit];
  49. self.sayHiBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  50. [self.sayHiBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_sayhi"] forState:UIControlStateNormal];
  51. [self.sayHiBtn sizeToFit];
  52. self.photoBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  53. [self.photoBtn setImage:[UIImage imageNamed:@"vqu_images_IM_photo"] forState:UIControlStateNormal];
  54. [self.photoBtn sizeToFit];
  55. self.emoticonBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  56. [self.emoticonBtn setImage:[UIImage imageNamed:@"vqu_images_IM_emoji"] forState:UIControlStateNormal];
  57. [self.emoticonBtn setImage:[UIImage imageNamed:@"vqu_images_IM_emoji"] forState:UIControlStateSelected];
  58. [self.emoticonBtn sizeToFit];
  59. self.giftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  60. [self.giftBtn setImage:[UIImage imageNamed:@"vqu_images_IM_gift"] forState:UIControlStateNormal];
  61. [self.giftBtn sizeToFit];
  62. self.videoBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  63. [self.videoBtn setImage:[UIImage imageNamed:@"vqu_images_IM_video1"] forState:UIControlStateNormal];
  64. [self.videoBtn sizeToFit];
  65. [self addSubview:_inputTextView];
  66. [self addSubview:self.recordBtn];
  67. // [self addSubview:self.cameraBtn];
  68. [self addSubview:self.sayHiBtn];
  69. [self addSubview:self.photoBtn];
  70. [self addSubview:self.emoticonBtn];
  71. [self addSubview:self.giftBtn];
  72. [self addSubview:self.videoBtn];
  73. }
  74. return self;
  75. }
  76. - (void)setInputBarItemTypes:(NSArray<NSNumber *> *)types{
  77. self.types = types;
  78. [self setNeedsLayout];
  79. }
  80. - (NSString *)contentText
  81. {
  82. return self.inputTextView.text;
  83. }
  84. - (void)setContentText:(NSString *)contentText
  85. {
  86. self.inputTextView.text = contentText;
  87. }
  88. - (NSArray *)inputBarItemTypes
  89. {
  90. return self.types;
  91. }
  92. - (CGSize)sizeThatFits:(CGSize)size
  93. {
  94. CGFloat viewHeight = 0.0f;
  95. if (self.status == NIMInputStatusAudio) {
  96. viewHeight = 70;
  97. }else{
  98. //算出 TextView 的宽度
  99. [self adjustTextViewWidth:size.width];
  100. // TextView 自适应高度
  101. if([NSThread isMainThread]){
  102. [self.inputTextView layoutIfNeeded];
  103. }else{
  104. dispatch_async(dispatch_get_main_queue(),^{
  105. [self.inputTextView layoutIfNeeded];
  106. });
  107. }
  108. viewHeight = self.inputTextView.frame.size.height;
  109. //得到 ToolBar 自身高度
  110. viewHeight = viewHeight +44+10;
  111. // viewHeight = 84;
  112. }
  113. return CGSizeMake(size.width,viewHeight);
  114. }
  115. - (void)adjustTextViewWidth:(CGFloat)width
  116. {
  117. // CGFloat textViewWidth = 0;
  118. // for (NSNumber *type in self.types) {
  119. // if (type.integerValue == NIMInputBarItemTypeTextAndRecord) {
  120. // continue;
  121. // }
  122. // UIView *view = [self subViewForType:type.integerValue];
  123. // textViewWidth += view.nim_width;
  124. // }
  125. // textViewWidth += (self.spacing * (self.types.count + 1));
  126. self.inputTextView.nim_width = self.nim_width - (leftSpacing + 5.0f + 23.0f) * 2;
  127. }
  128. - (void)layoutSubviews{
  129. [super layoutSubviews];
  130. CGFloat bottomGap = -16;
  131. CGFloat size = 23.0f;//35;
  132. [_inputTextView makeConstraints:^(MASConstraintMaker *make) {
  133. make.left.equalTo(self.recordBtn.mas_right).mas_equalTo(5.0f);
  134. make.top.mas_equalTo(5);
  135. make.bottom.mas_equalTo(-(5+44));
  136. make.right.equalTo(self.emoticonBtn.mas_left).mas_equalTo(-5.0f);
  137. }];
  138. [self.recordBtn makeConstraints:^(MASConstraintMaker *make) {
  139. make.left.mas_equalTo(leftSpacing);
  140. make.centerY.mas_equalTo(self->_inputTextView);
  141. make.size.mas_equalTo(CGSizeMake(size, size));
  142. }];
  143. [self.emoticonBtn makeConstraints:^(MASConstraintMaker *make) {
  144. make.right.offset(-leftSpacing);
  145. make.centerY.mas_equalTo(self->_inputTextView);
  146. make.size.mas_equalTo(CGSizeMake(size, size));
  147. }];
  148. NSArray <UIButton *> *footBtns = @[self.photoBtn,self.videoBtn,self.giftBtn,self.sayHiBtn];
  149. CGFloat midSpacing = (self.nim_width - (size * footBtns.count)) / footBtns.count;
  150. [footBtns mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:midSpacing leadSpacing:midSpacing / 2 tailSpacing:midSpacing / 2];
  151. [footBtns mas_makeConstraints:^(MASConstraintMaker *make) {
  152. make.bottom.offset(bottomGap);
  153. make.height.offset(size);
  154. }];
  155. // [self.cameraBtn makeConstraints:^(MASConstraintMaker *make) {
  156. // make.left.equalTo(self.recordBtn.right).offset(midSpacing);
  157. // make.bottom.mas_equalTo(bottomGap);
  158. // make.size.mas_equalTo(CGSizeMake(size, size));
  159. // }];
  160. // [self.photoBtn makeConstraints:^(MASConstraintMaker *make) {
  161. // make.left.equalTo(self.cameraBtn.right).offset(midSpacing);
  162. // make.bottom.mas_equalTo(bottomGap);
  163. // make.size.mas_equalTo(CGSizeMake(size, size));
  164. // }];
  165. //
  166. // [self.giftBtn makeConstraints:^(MASConstraintMaker *make) {
  167. // make.left.equalTo(self.emoticonBtn.right).offset(midSpacing);
  168. // make.bottom.mas_equalTo(bottomGap);
  169. // make.size.mas_equalTo(CGSizeMake(size, size));
  170. // }];
  171. // [self.videoBtn makeConstraints:^(MASConstraintMaker *make) {
  172. // make.left.equalTo(self.giftBtn.right).offset(midSpacing);
  173. // make.bottom.mas_equalTo(bottomGap);
  174. // make.size.mas_equalTo(CGSizeMake(size, size));
  175. // }];
  176. // [self.superview layoutIfNeeded];
  177. // [LCTools clipCorner:UIRectCornerTopLeft|UIRectCornerTopRight View:self size:CGSizeMake(20.0f, 20.0f)];
  178. }
  179. - (void)adjustTextAndRecordView
  180. {
  181. // if ([self.types containsObject:@(NIMInputBarItemTypeTextAndRecord)])
  182. // {
  183. // self.inputTextView.center = self.inputTextBkgImage.center;
  184. //
  185. // if (!self.inputTextView.superview)
  186. // {
  187. // //输入框
  188. // [self addSubview:self.inputTextView];
  189. // }
  190. // if (!self.recordButton.superview)
  191. // {
  192. // //中间点击录音按钮
  193. // self.recordButton.frame = self.inputTextBkgImage.frame;
  194. // [self addSubview:self.recordButton];
  195. // }
  196. // }
  197. }
  198. - (BOOL)showsKeyboard
  199. {
  200. return [self.inputTextView isFirstResponder];
  201. }
  202. - (void)setShowsKeyboard:(BOOL)showsKeyboard
  203. {
  204. if (showsKeyboard)
  205. {
  206. [self.inputTextView becomeFirstResponder];
  207. }
  208. else
  209. {
  210. [self.inputTextView resignFirstResponder];
  211. }
  212. }
  213. - (void)update:(NIMInputStatus)status
  214. {
  215. self.status = status;
  216. [self sizeToFit];
  217. if (status == NIMInputStatusText || status == NIMInputStatusMore)
  218. {
  219. [self.recordButton setHidden:YES];
  220. [self.inputTextView setHidden:NO];
  221. [self.inputTextBkgImage setHidden:NO];
  222. [self updateVoiceBtnImages:YES];
  223. [self updateEmotAndTextBtnImages:YES];
  224. }
  225. else if(status == NIMInputStatusAudio)
  226. {
  227. [self.recordButton setHidden:NO];
  228. [self.inputTextView setHidden:YES];
  229. [self.inputTextBkgImage setHidden:YES];
  230. [self updateVoiceBtnImages:NO];
  231. [self updateEmotAndTextBtnImages:YES];
  232. }
  233. else
  234. {
  235. [self.recordButton setHidden:YES];
  236. [self.inputTextView setHidden:NO];
  237. [self.inputTextBkgImage setHidden:NO];
  238. [self updateVoiceBtnImages:YES];
  239. [self updateEmotAndTextBtnImages:NO];
  240. }
  241. }
  242. - (void)updateVoiceBtnImages:(BOOL)selected
  243. {
  244. // [self.voiceBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_voice"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateNormal];
  245. // [self.voiceBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_voice"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateHighlighted];
  246. }
  247. - (void)updateEmotAndTextBtnImages:(BOOL)selected
  248. {
  249. // [self.emoticonBtn setImage:selected?[UIImage imageNamed:@"im_emoji"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateNormal];
  250. // [self.emoticonBtn setImage:selected?[UIImage imageNamed:@"im_emoji"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateHighlighted];
  251. }
  252. #pragma mark - NIMGrowingTextViewDelegate
  253. - (BOOL)youpaifshouldChangeTextInRange:(NSRange)range replacementText:(NSString *)replacementText
  254. {
  255. BOOL should = YES;
  256. if ([self.delegate respondsToSelector:@selector(youpaifshouldChangeTextInRange:replacementText:)]) {
  257. should = [self.delegate youpaifshouldChangeTextInRange:range replacementText:replacementText];
  258. }
  259. return should;
  260. }
  261. - (BOOL)textViewShouldBeginEditing:(YOUPAINIMGrowingTextView *)growingTextView
  262. {
  263. BOOL should = YES;
  264. if ([self.delegate respondsToSelector:@selector(textViewShouldBeginEditing)]) {
  265. should = [self.delegate textViewShouldBeginEditing];
  266. }
  267. return should;
  268. }
  269. - (void)textViewDidEndEditing:(YOUPAINIMGrowingTextView *)growingTextView
  270. {
  271. if ([self.delegate respondsToSelector:@selector(textViewDidEndEditing)]) {
  272. [self.delegate textViewDidEndEditing];
  273. }
  274. }
  275. - (void)textViewDidChange:(YOUPAINIMGrowingTextView *)growingTextView
  276. {
  277. if ([self.delegate respondsToSelector:@selector(textViewDidChange)]) {
  278. [self.delegate textViewDidChange];
  279. }
  280. }
  281. - (void)youpaifwillChangeHeight:(CGFloat)height
  282. {
  283. CGFloat toolBarHeight = height + 10+44;
  284. if ([self.delegate respondsToSelector:@selector(youpaiftoolBarWillChangeHeight:)]) {
  285. [self.delegate youpaiftoolBarWillChangeHeight:toolBarHeight];
  286. }
  287. }
  288. - (void)youpaifdidChangeHeight:(CGFloat)height
  289. {
  290. self.nim_height = height + 10+44;
  291. if ([self.delegate respondsToSelector:@selector(youpaiftoolBarDidChangeHeight:)]) {
  292. [self.delegate youpaiftoolBarDidChangeHeight:self.nim_height];
  293. }
  294. }
  295. #pragma mark - Get
  296. - (UIView *)subViewForType:(NIMInputBarItemType)type{
  297. if (!_dict) {
  298. _dict = @{
  299. @(NIMInputBarItemTypeVoice) : self.voiceBtn,
  300. @(NIMInputBarItemTypeTextAndRecord) : self.inputTextBkgImage,
  301. @(NIMInputBarItemTypeEmoticon) : self.emoticonBtn,
  302. @(NIMInputBarItemTypeMore) : self.moreMediaBtn
  303. };
  304. }
  305. return _dict[@(type)];
  306. }
  307. - (CGFloat)spacing{
  308. return 0.f;
  309. }
  310. - (CGFloat)textViewPadding
  311. {
  312. return 0.f;
  313. }
  314. @end
  315. @implementation YOUPAINIMInputToolBar(InputText)
  316. - (NSRange)selectedRange
  317. {
  318. return self.inputTextView.selectedRange;
  319. }
  320. - (void)setPlaceHolder:(NSString *)placeHolder
  321. {
  322. NSString* str ;
  323. if(placeHolder){
  324. str = placeHolder;
  325. }else{
  326. str = @"";
  327. }
  328. self.inputTextView.placeholderAttributedText = [[NSAttributedString alloc] initWithString:str attributes:@{NSForegroundColorAttributeName:[UIColor lightGrayColor],NSFontAttributeName:[UIFont systemFontOfSize:14]}];
  329. }
  330. - (void)insertText:(NSString *)text
  331. {
  332. NSRange range = self.inputTextView.selectedRange;
  333. NSString *replaceText = [self.inputTextView.text stringByReplacingCharactersInRange:range withString:text];
  334. range = NSMakeRange(range.location + text.length, 0);
  335. self.inputTextView.text = replaceText;
  336. self.inputTextView.selectedRange = range;
  337. }
  338. - (void)deleteText:(NSRange)range
  339. {
  340. NSString *text = self.contentText;
  341. if (range.location + range.length <= [text length]
  342. && range.location != NSNotFound && range.length != 0)
  343. {
  344. NSString *newText = [text stringByReplacingCharactersInRange:range withString:@""];
  345. NSRange newSelectRange = NSMakeRange(range.location, 0);
  346. [self.inputTextView setText:newText];
  347. self.inputTextView.selectedRange = newSelectRange;
  348. }
  349. }
  350. @end