NIMContactPickedView.m 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. //
  2. // ContactPickedView.m
  3. // NIM
  4. //
  5. // Created by ios on 10/23/13.
  6. // Copyright (c) 2013 Netease. All rights reserved.
  7. //
  8. #import "NIMContactPickedView.h"
  9. #import "NIMKit.h"
  10. #import "NIMAvatarImageView.h"
  11. #import "UIImage+NIMKit.h"
  12. #define avatarWidth 35
  13. #define blank 10
  14. #define topBlank 7
  15. enum RefreshType
  16. {
  17. RefreshType_Remove,
  18. RefreshType_Add
  19. };
  20. @interface NIMContactSelectAvatarView : NIMAvatarImageView
  21. @property (nonatomic, strong) NSString *userId;
  22. @end
  23. @implementation NIMContactSelectAvatarView
  24. @end
  25. @interface NIMContactPickedView()
  26. @property (nonatomic, strong) UIScrollView *scrollView;
  27. @property (nonatomic, strong) NSMutableArray *array;
  28. @property (nonatomic, assign) NSInteger currentPos;
  29. @property (nonatomic, strong) NIMContactSelectAvatarView *blankView;
  30. @end
  31. @implementation NIMContactPickedView
  32. - (instancetype)initWithCoder:(NSCoder *)aDecoder {
  33. self = [super initWithCoder:aDecoder];
  34. if (self) {
  35. [self initUI];
  36. }
  37. return self;
  38. }
  39. - (id)initWithFrame:(CGRect)frame
  40. {
  41. self = [super initWithFrame:frame];
  42. if (self) {
  43. [self initUI];
  44. }
  45. return self;
  46. }
  47. - (void)initUI {
  48. UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame];
  49. scrollView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
  50. UIViewAutoresizingFlexibleTopMargin |
  51. UIViewAutoresizingFlexibleWidth |
  52. UIViewAutoresizingFlexibleHeight;
  53. [scrollView setContentSize:self.frame.size];
  54. [scrollView setScrollEnabled:YES];
  55. [scrollView setScrollsToTop:NO];
  56. [self addSubview:scrollView];
  57. self.scrollView = scrollView;
  58. self.array = [NSMutableArray array];
  59. self.currentPos = blank;
  60. [self addBlankAvatarView];
  61. }
  62. - (void)addBlankAvatarView
  63. {
  64. self.blankView = [[NIMContactSelectAvatarView alloc]init];
  65. [self.blankView setImage:[UIImage nim_imageInKit:@"contact_head_selected.png"]];
  66. [self.blankView setFrame:CGRectMake(self.currentPos, topBlank, avatarWidth, avatarWidth)];
  67. self.blankView.userId = @"";
  68. [self.scrollView addSubview:self.blankView];
  69. }
  70. - (void)moveBlankAvatarView
  71. {
  72. CGRect frame = self.blankView.frame;
  73. frame.origin.x = self.currentPos;
  74. [UIView animateWithDuration:0.1 animations:^{
  75. [self.blankView setFrame:frame];
  76. }];
  77. }
  78. - (void)addAvatarView:(NIMContactSelectAvatarView *)view
  79. {
  80. [view addTarget:self action:@selector(remove:) forControlEvents:UIControlEventTouchUpInside];
  81. [self.array addObject:view];
  82. [self refreshView:RefreshType_Add];
  83. [view setFrame:CGRectMake(self.currentPos, topBlank, avatarWidth, avatarWidth)];
  84. [self.scrollView addSubview:view];
  85. self.currentPos = self.currentPos + blank + avatarWidth;
  86. [self moveBlankAvatarView];
  87. }
  88. - (void)removeAvatarView:(NIMContactSelectAvatarView *)view
  89. {
  90. NSInteger i = [self.array indexOfObject:view];
  91. [self.array removeObject:view];
  92. [self refreshView:RefreshType_Remove];
  93. [view removeFromSuperview];
  94. for (NSInteger j = i; j < [self.array count]; j++) {
  95. NIMContactSelectAvatarView *view = [self.array objectAtIndex:j];
  96. CGRect frame = view.frame;
  97. frame.origin.x = frame.origin.x - avatarWidth - blank;
  98. [view setFrame:frame];
  99. }
  100. self.currentPos = self.currentPos - blank - avatarWidth;
  101. [self moveBlankAvatarView];
  102. }
  103. - (void)addMemberInfo:(NIMKitInfo *)info
  104. {
  105. NIMContactSelectAvatarView *avatar = [[NIMContactSelectAvatarView alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
  106. NSURL *url = info.avatarUrlString ? [NSURL URLWithString:info.avatarUrlString] : nil;
  107. [avatar nim_setImageWithURL:url placeholderImage:info.avatarImage options:SDWebImageRetryFailed];
  108. avatar.userId = info.infoId;
  109. [self addAvatarView:avatar];
  110. }
  111. - (void)removeMemberInfo:(NIMKitInfo *)info
  112. {
  113. NSInteger i = 0;
  114. for (i = 0;i<[self.array count];i++) {
  115. NIMContactSelectAvatarView *view = [self.array objectAtIndex:i];
  116. if ([view.userId isEqualToString:info.infoId]) {
  117. [self removeAvatarView:view];
  118. break;
  119. }
  120. }
  121. }
  122. - (void)refreshView:(enum RefreshType)refreshType
  123. {
  124. NSInteger width = ([self.array count]+1)*(avatarWidth+blank)+blank;
  125. CGSize size = self.scrollView.contentSize;
  126. size.width = width;
  127. [self.scrollView setContentSize:size];
  128. CGPoint offset = self.scrollView.contentOffset;
  129. if (width> self.scrollView.frame.size.width) {
  130. int offsetX = width - self.scrollView.frame.size.width;
  131. if (!(refreshType == RefreshType_Remove && offsetX > offset.x)) {
  132. offset.x = offsetX;
  133. }
  134. }
  135. else {
  136. offset.x = 0;
  137. }
  138. [self.scrollView setContentOffset:offset animated:YES];
  139. }
  140. #pragma mark - action
  141. - (IBAction)remove:(id)sender
  142. {
  143. NIMContactSelectAvatarView *view = (NIMContactSelectAvatarView *)sender;
  144. [self.delegate removeUser:view.userId];
  145. [self removeAvatarView:view];
  146. }
  147. @end