YOUPAIBBNIMInputToolBar.m 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. //
  2. // YOUPAIBBNIMInputToolBar.m
  3. // VQU
  4. //
  5. // Created by Elaine on 2021/10/26.
  6. // Copyright © 2021 MS. All rights reserved.
  7. //
  8. #import "YOUPAIBBNIMInputToolBar.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 YOUPAIBBNIMInputToolBar()<NIMGrowingTextViewDelegate>
  15. @property (nonatomic,copy) NSArray<NSNumber *> *youpaiptypes;
  16. @property (nonatomic,copy) NSDictionary *youpaipdict;
  17. @property (nonatomic,strong) YOUPAINIMGrowingTextView *youpaipinputTextView;
  18. @property (nonatomic,assign) BBNIMInputStatus youpaipstatus;
  19. @end
  20. @implementation YOUPAIBBNIMInputToolBar
  21. - (instancetype)initWithFrame:(CGRect)frame{
  22. self = [super initWithFrame:frame];
  23. if (self) {
  24. [self setBackgroundColor:LCBkgColor];
  25. _youpaipinputTextView = [[YOUPAINIMGrowingTextView alloc] initWithFrame:CGRectZero];
  26. _youpaipinputTextView.font = [UIFont systemFontOfSize:14.0f];
  27. _youpaipinputTextView.maxNumberOfLines = 4;
  28. _youpaipinputTextView.minNumberOfLines = 1;
  29. _youpaipinputTextView.textColor = ZYTextInputColor;
  30. _youpaipinputTextView.backgroundColor = HexColorFromRGB(0x31323D);
  31. _youpaipinputTextView.layer.cornerRadius = 8;
  32. _youpaipinputTextView.nim_size = [_youpaipinputTextView intrinsicContentSize];
  33. _youpaipinputTextView.textViewDelegate = self;
  34. _youpaipinputTextView.returnKeyType = UIReturnKeySend;
  35. self.youpaiptypes = @[
  36. @(NIMInputBarItemTypeVoice),
  37. @(NIMInputBarItemTypeTextAndRecord),
  38. @(NIMInputBarItemTypeEmoticon),
  39. @(NIMInputBarItemTypeMore),
  40. ];
  41. //修改inputview 按钮 注释 by leo
  42. self.youpaiprecordBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  43. [self.youpaiprecordBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_record"] forState:UIControlStateNormal];
  44. [self.youpaiprecordBtn setImage:[UIImage imageNamed:@"vqu_images_IM_record_select"] forState:UIControlStateSelected];
  45. [self.youpaiprecordBtn sizeToFit];
  46. self.youpaipcameraBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  47. [self.youpaipcameraBtn setImage:[UIImage imageNamed:@"vqu_images_IM_im_camera"] forState:UIControlStateNormal];
  48. [self.youpaipcameraBtn sizeToFit];
  49. self.youpaipphotoBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  50. [self.youpaipphotoBtn setImage:[UIImage imageNamed:@"vqu_images_IM_photo"] forState:UIControlStateNormal];
  51. [self.youpaipphotoBtn sizeToFit];
  52. self.youpaipemoticonBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  53. [self.youpaipemoticonBtn setImage:[UIImage imageNamed:@"vqu_images_IM_emoji"] forState:UIControlStateNormal];
  54. [self.youpaipemoticonBtn setImage:[UIImage imageNamed:@"vqu_images_vqu_images_IM_emoji_select"] forState:UIControlStateSelected];
  55. [self.youpaipemoticonBtn sizeToFit];
  56. self.youpaipgiftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  57. [self.youpaipgiftBtn setImage:[UIImage imageNamed:@"vqu_images_IM_gift"] forState:UIControlStateNormal];
  58. [self.youpaipgiftBtn sizeToFit];
  59. self.youpaipvideoBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  60. [self.youpaipvideoBtn setImage:[UIImage imageNamed:@"vqu_images_IM_video1"] forState:UIControlStateNormal];
  61. [self.youpaipvideoBtn sizeToFit];
  62. [self addSubview:_youpaipinputTextView];
  63. [self addSubview:self.youpaiprecordBtn];
  64. [self addSubview:self.youpaipcameraBtn];
  65. [self addSubview:self.youpaipphotoBtn];
  66. [self addSubview:self.youpaipemoticonBtn];
  67. [self addSubview:self.youpaipgiftBtn];
  68. [self addSubview:self.youpaipvideoBtn];
  69. }
  70. return self;
  71. }
  72. - (void)setYoupaipinputBarItemTypes:(NSArray<NSNumber *> *)youpaiptypes{
  73. self.youpaiptypes = youpaiptypes;
  74. [self setNeedsLayout];
  75. }
  76. - (NSString *)contentText
  77. {
  78. return self.youpaipinputTextView.text;
  79. }
  80. - (void)setContentText:(NSString *)contentText
  81. {
  82. self.youpaipinputTextView.text = contentText;
  83. }
  84. - (NSArray *)youpaipinputBarItemTypes
  85. {
  86. return self.youpaiptypes;
  87. }
  88. - (CGSize)sizeThatFits:(CGSize)size
  89. {
  90. CGFloat viewHeight = 0.0f;
  91. if (self.youpaipstatus == BBNIMInputStatusAudio) {
  92. viewHeight = 70;
  93. }else{
  94. //算出 TextView 的宽度
  95. [self adjustTextViewWidth:size.width];
  96. // TextView 自适应高度
  97. [self.youpaipinputTextView layoutIfNeeded];
  98. viewHeight = self.youpaipinputTextView.frame.size.height;
  99. //得到 ToolBar 自身高度
  100. viewHeight = viewHeight +44+10;
  101. // viewHeight = 84;
  102. }
  103. return CGSizeMake(size.width,viewHeight);
  104. }
  105. - (void)adjustTextViewWidth:(CGFloat)width
  106. {
  107. // CGFloat textViewWidth = 0;
  108. // for (NSNumber *type in self.types) {
  109. // if (type.integerValue == NIMInputBarItemTypeTextAndRecord) {
  110. // continue;
  111. // }
  112. // UIView *view = [self subViewForType:type.integerValue];
  113. // textViewWidth += view.nim_width;
  114. // }
  115. // textViewWidth += (self.spacing * (self.types.count + 1));
  116. self.youpaipinputTextView.nim_width = self.nim_width-leftSpacing*2;
  117. }
  118. - (void)layoutSubviews{
  119. [super layoutSubviews];
  120. CGFloat bottomGap = -10;
  121. CGFloat size = 35;
  122. CGFloat midSpacing = (self.nim_width-leftSpacing*2-size*6)/5;
  123. [self.youpaiprecordBtn makeConstraints:^(MASConstraintMaker *make) {
  124. make.left.mas_equalTo(leftSpacing);
  125. make.bottom.mas_equalTo(bottomGap);
  126. make.size.mas_equalTo(CGSizeMake(size, size));
  127. }];
  128. [self.youpaipcameraBtn makeConstraints:^(MASConstraintMaker *make) {
  129. make.left.equalTo(self.youpaiprecordBtn.right).offset(midSpacing);
  130. make.bottom.mas_equalTo(bottomGap);
  131. make.size.mas_equalTo(CGSizeMake(size, size));
  132. }];
  133. [self.youpaipphotoBtn makeConstraints:^(MASConstraintMaker *make) {
  134. make.left.equalTo(self.youpaipcameraBtn.right).offset(midSpacing);
  135. make.bottom.mas_equalTo(bottomGap);
  136. make.size.mas_equalTo(CGSizeMake(size, size));
  137. }];
  138. [self.youpaipemoticonBtn makeConstraints:^(MASConstraintMaker *make) {
  139. make.left.equalTo(self.youpaipphotoBtn.right).offset(midSpacing);
  140. make.bottom.mas_equalTo(bottomGap);
  141. make.size.mas_equalTo(CGSizeMake(size, size));
  142. }];
  143. [self.youpaipgiftBtn makeConstraints:^(MASConstraintMaker *make) {
  144. make.left.equalTo(self.youpaipemoticonBtn.right).offset(midSpacing);
  145. make.bottom.mas_equalTo(bottomGap);
  146. make.size.mas_equalTo(CGSizeMake(size, size));
  147. }];
  148. [self.youpaipvideoBtn makeConstraints:^(MASConstraintMaker *make) {
  149. make.left.equalTo(self.youpaipgiftBtn.right).offset(midSpacing);
  150. make.bottom.mas_equalTo(bottomGap);
  151. make.size.mas_equalTo(CGSizeMake(size, size));
  152. }];
  153. // [self.youpaipvideoBtn makeConstraints:^(MASConstraintMaker *make) {
  154. // make.left.equalTo(self.youpaipemoticonBtn.right).offset(midSpacing);
  155. // make.bottom.mas_equalTo(bottomGap);
  156. // make.size.mas_equalTo(CGSizeMake(size, size));
  157. // }];
  158. [_youpaipinputTextView makeConstraints:^(MASConstraintMaker *make) {
  159. make.left.mas_equalTo(leftSpacing);
  160. make.top.mas_equalTo(5);
  161. make.bottom.mas_equalTo(-(5+44));
  162. make.right.mas_equalTo(-leftSpacing);
  163. }];
  164. }
  165. - (void)youpaifadjustTextAndRecordView
  166. {
  167. // if ([self.types containsObject:@(NIMInputBarItemTypeTextAndRecord)])
  168. // {
  169. // self.youpaipinputTextView.center = self.youpaipinputTextBkgImage.center;
  170. //
  171. // if (!self.youpaipinputTextView.superview)
  172. // {
  173. // //输入框
  174. // [self addSubview:self.youpaipinputTextView];
  175. // }
  176. // if (!self.youpaiprecordButton.superview)
  177. // {
  178. // //中间点击录音按钮
  179. // self.youpaiprecordButton.frame = self.youpaipinputTextBkgImage.frame;
  180. // [self addSubview:self.youpaiprecordButton];
  181. // }
  182. // }
  183. }
  184. - (BOOL)showsKeyboard
  185. {
  186. return [self.youpaipinputTextView isFirstResponder];
  187. }
  188. - (void)setShowsKeyboard:(BOOL)showsKeyboard
  189. {
  190. if (showsKeyboard)
  191. {
  192. [self.youpaipinputTextView becomeFirstResponder];
  193. }
  194. else
  195. {
  196. [self.youpaipinputTextView resignFirstResponder];
  197. }
  198. }
  199. - (void)youpaifupdate:(BBNIMInputStatus)status
  200. {
  201. self.youpaipstatus = status;
  202. [self sizeToFit];
  203. if (status == BBNIMInputStatusText || status == BBNIMInputStatusMore)
  204. {
  205. [self.youpaiprecordButton setHidden:YES];
  206. [self.youpaipinputTextView setHidden:NO];
  207. [self.youpaipinputTextBkgImage setHidden:NO];
  208. [self updateVoiceBtnImages:YES];
  209. [self updateEmotAndTextBtnImages:YES];
  210. }
  211. else if(status == BBNIMInputStatusAudio)
  212. {
  213. [self.youpaiprecordButton setHidden:NO];
  214. [self.youpaipinputTextView setHidden:YES];
  215. [self.youpaipinputTextBkgImage setHidden:YES];
  216. [self updateVoiceBtnImages:NO];
  217. [self updateEmotAndTextBtnImages:YES];
  218. }
  219. else
  220. {
  221. [self.youpaiprecordButton setHidden:YES];
  222. [self.youpaipinputTextView setHidden:NO];
  223. [self.youpaipinputTextBkgImage setHidden:NO];
  224. [self updateVoiceBtnImages:YES];
  225. [self updateEmotAndTextBtnImages:NO];
  226. }
  227. }
  228. - (void)updateVoiceBtnImages:(BOOL)selected
  229. {
  230. // [self.youpaipvoiceBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_voice"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateNormal];
  231. // [self.youpaipvoiceBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_voice"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateHighlighted];
  232. }
  233. - (void)updateEmotAndTextBtnImages:(BOOL)selected
  234. {
  235. // [self.youpaipemoticonBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_emoji"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateNormal];
  236. // [self.youpaipemoticonBtn setImage:selected?[UIImage imageNamed:@"vqu_images_IM_emoji"]:[UIImage imageNamed:@"im_keyboard"] forState:UIControlStateHighlighted];
  237. }
  238. #pragma mark - VQ_NIMGrowingTextViewDelegate
  239. - (BOOL)youpaifshouldChangeTextInRange:(NSRange)range replacementText:(NSString *)replacementText
  240. {
  241. BOOL youpaipshould = YES;
  242. if ([self.delegate respondsToSelector:@selector(shouldChangeTextInRange:replacementText:)]) {
  243. youpaipshould = [self.delegate shouldChangeTextInRange:range replacementText:replacementText];
  244. }
  245. return youpaipshould;
  246. }
  247. - (BOOL)textViewShouldBeginEditing:(YOUPAINIMGrowingTextView *)growingTextView
  248. {
  249. BOOL youpaipshould = YES;
  250. if ([self.delegate respondsToSelector:@selector(textViewShouldBeginEditing)]) {
  251. youpaipshould = [self.delegate textViewShouldBeginEditing];
  252. }
  253. return youpaipshould;
  254. }
  255. - (void)textViewDidEndEditing:(YOUPAINIMGrowingTextView *)growingTextView
  256. {
  257. if ([self.delegate respondsToSelector:@selector(textViewDidEndEditing)]) {
  258. [self.delegate textViewDidEndEditing];
  259. }
  260. }
  261. - (void)textViewDidChange:(YOUPAINIMGrowingTextView *)growingTextView
  262. {
  263. if ([self.delegate respondsToSelector:@selector(textViewDidChange)]) {
  264. [self.delegate textViewDidChange];
  265. }
  266. }
  267. - (void)willChangeHeight:(CGFloat)height
  268. {
  269. CGFloat toolBarHeight = height + 10+44;
  270. if ([self.delegate respondsToSelector:@selector(toolBarWillChangeHeight:)]) {
  271. [self.delegate toolBarWillChangeHeight:toolBarHeight];
  272. }
  273. }
  274. - (void)didChangeHeight:(CGFloat)height
  275. {
  276. self.nim_height = height + 10+44;
  277. if ([self.delegate respondsToSelector:@selector(toolBarDidChangeHeight:)]) {
  278. [self.delegate toolBarDidChangeHeight:self.nim_height];
  279. }
  280. }
  281. #pragma mark - Get
  282. - (UIView *)subViewForType:(NIMInputBarItemType)type{
  283. if (!_youpaipdict) {
  284. _youpaipdict = @{
  285. @(NIMInputBarItemTypeVoice) : self.youpaipvoiceBtn,
  286. @(NIMInputBarItemTypeTextAndRecord) : self.youpaipinputTextBkgImage,
  287. @(NIMInputBarItemTypeEmoticon) : self.youpaipemoticonBtn,
  288. @(NIMInputBarItemTypeMore) : self.youpaipmoreMediaBtn
  289. };
  290. }
  291. return _youpaipdict[@(type)];
  292. }
  293. - (CGFloat)spacing{
  294. return 0.f;
  295. }
  296. - (CGFloat)textViewPadding
  297. {
  298. return 0.f;
  299. }
  300. @end
  301. @implementation YOUPAIBBNIMInputToolBar(InputText)
  302. - (NSRange)youpaifselectedRange
  303. {
  304. return self.youpaipinputTextView.selectedRange;
  305. }
  306. - (void)youpaifsetPlaceHolder:(NSString *)placeHolder
  307. {
  308. NSString* str ;
  309. if(placeHolder){
  310. str = placeHolder;
  311. }else{
  312. str = @"";
  313. }
  314. self.youpaipinputTextView.placeholderAttributedText = [[NSAttributedString alloc] initWithString:str attributes:@{NSForegroundColorAttributeName:[UIColor lightGrayColor],NSFontAttributeName:[UIFont systemFontOfSize:14]}];
  315. }
  316. - (void)youpaifinsertText:(NSString *)text
  317. {
  318. NSRange range = self.youpaipinputTextView.selectedRange;
  319. NSString *replaceText = [self.youpaipinputTextView.text stringByReplacingCharactersInRange:range withString:text];
  320. range = NSMakeRange(range.location + text.length, 0);
  321. self.youpaipinputTextView.text = replaceText;
  322. self.youpaipinputTextView.selectedRange = range;
  323. }
  324. - (void)youpaifdeleteText:(NSRange)range
  325. {
  326. NSString *text = self.contentText;
  327. if (range.location + range.length <= [text length]
  328. && range.location != NSNotFound && range.length != 0)
  329. {
  330. NSString *newText = [text stringByReplacingCharactersInRange:range withString:@""];
  331. NSRange newSelectRange = NSMakeRange(range.location, 0);
  332. [self.youpaipinputTextView setText:newText];
  333. self.youpaipinputTextView.selectedRange = newSelectRange;
  334. }
  335. }
  336. @end