YOUPAINIMInputMoreContainerView.m 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //
  2. // NTESInputMoreContainerView.m
  3. // NIMDemo
  4. //
  5. // Created by chris.
  6. // Copyright (c) 2015年 Netease. All rights reserved.
  7. //
  8. #import "YOUPAINIMInputMoreContainerView.h"
  9. #import "NIMPageView.h"
  10. #import "NIMMediaItem.h"
  11. #import "UIView+NIM.h"
  12. #import "NIMKit.h"
  13. NSInteger NIMMaxItemCountInPage = 8;
  14. NSInteger NIMButtonItemWidth = 75;
  15. NSInteger NIMButtonItemHeight = 85;
  16. NSInteger NIMPageRowCount = 2;
  17. NSInteger NIMPageColumnCount = 4;
  18. NSInteger NIMButtonBegintLeftX = 11;
  19. @interface YOUPAINIMInputMoreContainerView() <NIMPageViewDataSource,NIMPageViewDelegate>
  20. {
  21. NSArray *_mediaButtons;
  22. NSArray *_mediaItems;
  23. }
  24. @property (nonatomic, strong) NIMPageView *pageView;
  25. @end
  26. @implementation YOUPAINIMInputMoreContainerView
  27. - (instancetype)initWithFrame:(CGRect)frame
  28. {
  29. self = [super initWithFrame:frame];
  30. if (self) {
  31. _pageView = [[NIMPageView alloc] initWithFrame:CGRectZero];
  32. _pageView.dataSource = self;
  33. [self addSubview:_pageView];
  34. }
  35. return self;
  36. }
  37. - (void)setConfig:(id<NIMSessionConfig>)config
  38. {
  39. _config = config;
  40. [self genMediaButtons];
  41. [self.pageView reloadData];
  42. }
  43. - (CGSize)sizeThatFits:(CGSize)size
  44. {
  45. return CGSizeMake(size.width, 216.f);
  46. }
  47. - (void)genMediaButtons
  48. {
  49. NSMutableArray *mediaButtons = [NSMutableArray array];
  50. NSMutableArray *mediaItems = [NSMutableArray array];
  51. NSArray *items;
  52. if (!self.config)
  53. {
  54. items = [NIMKit sharedKit].config.defaultMediaItems;
  55. }
  56. else if([self.config respondsToSelector:@selector(mediaItems)])
  57. {
  58. items = [self.config mediaItems];
  59. }
  60. [items enumerateObjectsUsingBlock:^(NIMMediaItem *item, NSUInteger idx, BOOL *stop) {
  61. [mediaItems addObject:item];
  62. UIButton *btn = [[UIButton alloc] init];
  63. btn.tag = idx;
  64. [btn setImage:item.normalImage forState:UIControlStateNormal];
  65. [btn setImage:item.selectedImage forState:UIControlStateHighlighted];
  66. [btn setTitle:item.title forState:UIControlStateNormal];
  67. [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  68. [btn setTitleEdgeInsets:UIEdgeInsetsMake(76, -75, 0, 0)];
  69. [btn.titleLabel setFont:[UIFont systemFontOfSize:14.0]];
  70. btn.titleLabel.textAlignment = NSTextAlignmentCenter;
  71. [mediaButtons addObject:btn];
  72. }];
  73. _mediaButtons = mediaButtons;
  74. _mediaItems = mediaItems;
  75. }
  76. - (void)setFrame:(CGRect)frame{
  77. CGFloat originalWidth = self.frame.size.width;
  78. [super setFrame:frame];
  79. if (originalWidth != frame.size.width)
  80. {
  81. self.pageView.frame = self.bounds;
  82. [self.pageView reloadData];
  83. }
  84. }
  85. - (void)dealloc
  86. {
  87. _pageView.dataSource = nil;
  88. }
  89. #pragma mark PageViewDataSource
  90. - (NSInteger)numberOfPages: (NIMPageView *)pageView
  91. {
  92. NSInteger count = [_mediaButtons count] / NIMMaxItemCountInPage;
  93. count = ([_mediaButtons count] % NIMMaxItemCountInPage == 0) ? count: count + 1;
  94. return MAX(count, 1);
  95. }
  96. - (UIView*)mediaPageView:(NIMPageView*)pageView beginItem:(NSInteger)begin endItem:(NSInteger)end
  97. {
  98. UIView *subView = [[UIView alloc] init];
  99. NSInteger span = (self.nim_width - NIMPageColumnCount * NIMButtonItemWidth) / (NIMPageColumnCount +1);
  100. CGFloat startY = NIMButtonBegintLeftX;
  101. NSInteger coloumnIndex = 0;
  102. NSInteger rowIndex = 0;
  103. NSInteger indexInPage = 0;
  104. for (NSInteger index = begin; index < end; index ++)
  105. {
  106. UIButton *button = [_mediaButtons objectAtIndex:index];
  107. [button addTarget:self action:@selector(onTouchButton:) forControlEvents:UIControlEventTouchUpInside];
  108. //计算位置
  109. rowIndex = indexInPage / NIMPageColumnCount;
  110. coloumnIndex= indexInPage % NIMPageColumnCount;
  111. CGFloat x = span + (NIMButtonItemWidth + span) * coloumnIndex;
  112. CGFloat y = 0.0;
  113. if (rowIndex > 0)
  114. {
  115. y = rowIndex * NIMButtonItemHeight + startY + 15;
  116. }
  117. else
  118. {
  119. y = rowIndex * NIMButtonItemHeight + startY;
  120. }
  121. [button setFrame:CGRectMake(x, y, NIMButtonItemWidth, NIMButtonItemHeight)];
  122. [subView addSubview:button];
  123. indexInPage ++;
  124. }
  125. return subView;
  126. }
  127. - (UIView*)oneLineMediaInPageView:(NIMPageView *)pageView
  128. viewInPage: (NSInteger)index
  129. count:(NSInteger)count
  130. {
  131. UIView *subView = [[UIView alloc] init];
  132. NSInteger span = (self.nim_width - count * NIMButtonItemWidth) / (count +1);
  133. for (NSInteger btnIndex = 0; btnIndex < count; btnIndex ++)
  134. {
  135. UIButton *button = [_mediaButtons objectAtIndex:btnIndex];
  136. [button addTarget:self action:@selector(onTouchButton:) forControlEvents:UIControlEventTouchUpInside];
  137. CGRect iconRect = CGRectMake(span + (NIMButtonItemWidth + span) * btnIndex, 58, NIMButtonItemWidth, NIMButtonItemHeight);
  138. [button setFrame:iconRect];
  139. [subView addSubview:button];
  140. }
  141. return subView;
  142. }
  143. - (UIView *)pageView: (NIMPageView *)pageView viewInPage: (NSInteger)index
  144. {
  145. if ([_mediaButtons count] == 2 || [_mediaButtons count] == 3) //一行显示2个或者3个
  146. {
  147. return [self oneLineMediaInPageView:pageView viewInPage:index count:[_mediaButtons count]];
  148. }
  149. if (index < 0)
  150. {
  151. assert(0);
  152. index = 0;
  153. }
  154. NSInteger begin = index * NIMMaxItemCountInPage;
  155. NSInteger end = (index + 1) * NIMMaxItemCountInPage;
  156. if (end > [_mediaButtons count])
  157. {
  158. end = [_mediaButtons count];
  159. }
  160. return [self mediaPageView:pageView beginItem:begin endItem:end];
  161. }
  162. #pragma mark - button actions
  163. - (void)onTouchButton:(id)sender
  164. {
  165. NSInteger index = [(UIButton *)sender tag];
  166. NIMMediaItem *item = _mediaItems[index];
  167. if (_actionDelegate && [_actionDelegate respondsToSelector:@selector(onTapMediaItem:)]) {
  168. BOOL handled = [_actionDelegate onTapMediaItem:item];
  169. if (!handled) {
  170. NSAssert(0, @"invalid item selector!");
  171. }
  172. }
  173. }
  174. @end