YMGroupGreetingPopupView.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. //
  2. // YMGroupGreetingPopupView.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2024/12/19.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "YMGroupGreetingPopupView.h"
  9. #import <SDWebImage/UIImageView+WebCache.h>
  10. @interface YMGroupGreetingPopupView ()
  11. /** 换一换按钮 */
  12. @property (nonatomic, strong) UIView *bgv;
  13. /** 换一换按钮 */
  14. @property (nonatomic, strong) UIButton *refreshBtn;
  15. /** 用户容器视图 */
  16. @property (nonatomic, strong) UIView *userContainerView;
  17. @property (nonatomic, assign) CGFloat userContainerViewHeight;
  18. /** 打个招呼按钮 */
  19. @property (nonatomic, strong) UIButton *sendGreetingBtn;
  20. /** 用户列表数据 */
  21. @property (nonatomic, strong) NSArray<YMGroupGreetingUserModel *> *userList;
  22. @end
  23. @implementation YMGroupGreetingPopupView
  24. /**
  25. * 初始化视图
  26. */
  27. - (void)ym_setupViews {
  28. self.backgroundColor = UIColor.clearColor;
  29. self.layer.cornerRadius = adapt(12);
  30. self.layer.masksToBounds = YES;
  31. self.userContainerViewHeight = adapt(120); // 默认
  32. [self addSubview:self.bgv];
  33. [self.bgv addSubview:self.refreshBtn];
  34. [self.bgv addSubview:self.userContainerView];
  35. [self.bgv addSubview:self.sendGreetingBtn];
  36. [self setNeedsUpdateConstraints];
  37. [self updateConstraintsIfNeeded];
  38. [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithActionBlock:^(id _Nonnull sender) {
  39. if (self.clickBlankAreaBlock) {
  40. self.clickBlankAreaBlock();
  41. }
  42. }]];
  43. }
  44. /**
  45. * 更新约束
  46. */
  47. - (void)updateConstraints {
  48. [self.bgv mas_remakeConstraints:^(MASConstraintMaker *make) {
  49. make.center.equalTo(self);
  50. make.width.mas_equalTo(kScreenWidth - adapt(40));
  51. }];
  52. [self.refreshBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
  53. make.top.equalTo(self.bgv).offset(adapt(16));
  54. make.right.equalTo(self.bgv).offset(adapt(-16));
  55. make.width.mas_equalTo(adapt(70));
  56. make.height.mas_equalTo(adapt(26));
  57. }];
  58. [self.userContainerView mas_remakeConstraints:^(MASConstraintMaker *make) {
  59. make.top.equalTo(self.refreshBtn.mas_bottom).offset(adapt(20));
  60. make.left.equalTo(self.bgv).offset(adapt(20));
  61. make.right.equalTo(self.bgv).offset(adapt(-20));
  62. make.height.mas_equalTo(self.userContainerViewHeight); // 默认高度,会根据用户数量动态调整
  63. }];
  64. [self.sendGreetingBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
  65. make.top.equalTo(self.userContainerView.mas_bottom).offset(adapt(20));
  66. make.left.equalTo(self.bgv).offset(adapt(20));
  67. make.right.equalTo(self.bgv).offset(adapt(-20));
  68. make.bottom.equalTo(self.bgv).offset(adapt(-20));
  69. make.height.mas_equalTo(adapt(50));
  70. }];
  71. [super updateConstraints];
  72. }
  73. /**
  74. * 配置用户列表数据
  75. */
  76. - (void)configureWithUserList:(NSArray<YMGroupGreetingUserModel *> *)userList {
  77. self.userList = userList;
  78. [self setupUserViews];
  79. [self updateConstraints];
  80. }
  81. /**
  82. * 设置用户视图
  83. */
  84. - (void)setupUserViews {
  85. // 清除之前的子视图
  86. for (UIView *subview in self.userContainerView.subviews) {
  87. [subview removeFromSuperview];
  88. }
  89. NSInteger userCount = self.userList.count;
  90. if (userCount == 0) return;
  91. // 限制最多显示5个用户
  92. userCount = MIN(userCount, 6);
  93. CGFloat avatarSize = (kScreenWidth - (adapt(40) * 4)) / 3;
  94. CGFloat spacing = adapt(40);
  95. CGFloat containerWidth = kScreenWidth - adapt(40); // 减去左右边距
  96. // 根据用户数量决定布局
  97. [self setupLayoutWithCount:userCount avatarSize:avatarSize spacing:spacing containerWidth:containerWidth];
  98. self.userContainerViewHeight = (avatarSize + adapt(40)) * (userCount / 3 + (userCount % 3 == 0 ? 0 : 1));
  99. }
  100. - (void)setupLayoutWithCount:(NSInteger)count avatarSize:(CGFloat)avatarSize spacing:(CGFloat)spacing containerWidth:(CGFloat)containerWidth {
  101. NSInteger rowCount = count / 3 + (count % 3 == 0 ? 0 : 1);
  102. CGFloat startX = 0;
  103. for (NSInteger i = 0; i < rowCount; i ++) {
  104. for (NSInteger j = 0; j < 3; j ++) {
  105. NSInteger index = i * 3 + j;
  106. if (index >= count) {
  107. break;
  108. }
  109. YMGroupGreetingUserModel *user = self.userList[index];
  110. UIView *userView = [self createUserViewWithModel:user];
  111. [self.userContainerView addSubview:userView];
  112. [userView mas_makeConstraints:^(MASConstraintMaker *make) {
  113. make.top.equalTo(self.userContainerView).offset(i * (avatarSize + adapt(40)));
  114. make.left.equalTo(self.userContainerView).offset(startX + j * (avatarSize + spacing));
  115. make.width.mas_equalTo(avatarSize);
  116. make.height.mas_equalTo(avatarSize + adapt(40));
  117. }];
  118. }
  119. }
  120. }
  121. /**
  122. * 单行布局
  123. */
  124. - (void)setupSingleRowLayoutWithCount:(NSInteger)count avatarSize:(CGFloat)avatarSize spacing:(CGFloat)spacing containerWidth:(CGFloat)containerWidth {
  125. //CGFloat totalWidth = count * avatarSize + (count - 1) * spacing;
  126. CGFloat startX = 0;
  127. for (NSInteger i = 0; i < count; i++) {
  128. YMGroupGreetingUserModel *user = self.userList[i];
  129. UIView *userView = [self createUserViewWithModel:user];
  130. [self.userContainerView addSubview:userView];
  131. [userView mas_makeConstraints:^(MASConstraintMaker *make) {
  132. make.left.equalTo(self.userContainerView).offset(startX + i * (avatarSize + spacing));
  133. make.top.equalTo(self.userContainerView);
  134. make.width.mas_equalTo(avatarSize);
  135. make.height.mas_equalTo(avatarSize + adapt(40));
  136. }];
  137. }
  138. }
  139. /**
  140. * 双行布局
  141. */
  142. - (void)setupDoubleRowLayoutWithCount:(NSInteger)count avatarSize:(CGFloat)avatarSize spacing:(CGFloat)spacing containerWidth:(CGFloat)containerWidth {
  143. NSInteger firstRowCount = (count + 1) / 2; // 第一行用户数
  144. NSInteger secondRowCount = count - firstRowCount; // 第二行用户数
  145. // 第一行
  146. //CGFloat firstRowTotalWidth = firstRowCount * avatarSize + (firstRowCount - 1) * spacing;
  147. CGFloat firstRowStartX = 0;
  148. for (NSInteger i = 0; i < firstRowCount; i++) {
  149. YMGroupGreetingUserModel *user = self.userList[i];
  150. UIView *userView = [self createUserViewWithModel:user];
  151. [self.userContainerView addSubview:userView];
  152. [userView mas_makeConstraints:^(MASConstraintMaker *make) {
  153. make.left.equalTo(self.userContainerView).offset(firstRowStartX + i * (avatarSize + spacing));
  154. make.top.equalTo(self.userContainerView);
  155. make.width.mas_equalTo(avatarSize);
  156. make.height.mas_equalTo(avatarSize + adapt(40));
  157. }];
  158. }
  159. // 第二行
  160. if (secondRowCount > 0) {
  161. //CGFloat secondRowTotalWidth = secondRowCount * avatarSize + (secondRowCount - 1) * spacing;
  162. //CGFloat secondRowStartX = 0 + avatarSize + adapt(20) - (avatarSize / 2.0);
  163. CGFloat secondRowStartX = 0;
  164. for (NSInteger i = 0; i < secondRowCount; i++) {
  165. YMGroupGreetingUserModel *user = self.userList[firstRowCount + i];
  166. UIView *userView = [self createUserViewWithModel:user];
  167. [self.userContainerView addSubview:userView];
  168. [userView mas_makeConstraints:^(MASConstraintMaker *make) {
  169. make.left.equalTo(self.userContainerView).offset(secondRowStartX + i * (avatarSize + spacing));
  170. make.top.equalTo(self.userContainerView).offset(avatarSize + adapt(40));
  171. make.width.mas_equalTo(avatarSize);
  172. make.height.mas_equalTo(avatarSize + adapt(40));
  173. }];
  174. }
  175. }
  176. }
  177. /**
  178. * 创建用户视图
  179. */
  180. - (UIView *)createUserViewWithModel:(YMGroupGreetingUserModel *)user {
  181. CGFloat avatarSize = (kScreenWidth - (adapt(40) * 4)) / 3;
  182. UIView *userView = [[UIView alloc] init];
  183. // 头像
  184. UIImageView *avatarImageView = [[UIImageView alloc] init];
  185. avatarImageView.layer.cornerRadius = avatarSize / 2.0;
  186. avatarImageView.layer.masksToBounds = YES;
  187. avatarImageView.backgroundColor = HexColorFromRGB(0xF5F5F5);
  188. avatarImageView.contentMode = UIViewContentModeScaleAspectFill;
  189. // 设置头像
  190. if (user.avatar.length > 0) {
  191. NSURL *avatarURL = [LCTools getImageUrlWithAddress:user.avatar];
  192. [avatarImageView sd_setImageWithURL:avatarURL placeholderImage:[UIImage imageNamed:@"vqu_images_P_man"]];
  193. } else {
  194. avatarImageView.image = [UIImage imageNamed:@"vqu_images_P_man"];
  195. }
  196. [userView addSubview:avatarImageView];
  197. // 昵称
  198. UILabel *nicknameLabel = [[UILabel alloc] init];
  199. nicknameLabel.text = user.nickname.length > 0 ? user.nickname : @"用户";
  200. nicknameLabel.font = [UIFont systemFontOfSize:adapt(10)];
  201. nicknameLabel.textColor = HexColorFromRGB(0x333333);
  202. nicknameLabel.textAlignment = NSTextAlignmentCenter;
  203. nicknameLabel.lineBreakMode = NSLineBreakByTruncatingTail;
  204. [userView addSubview:nicknameLabel];
  205. // 约束
  206. [avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  207. make.top.centerX.equalTo(userView);
  208. make.width.height.mas_equalTo(avatarSize);
  209. }];
  210. [nicknameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  211. make.top.equalTo(avatarImageView.mas_bottom).offset(adapt(0));
  212. make.left.right.equalTo(userView);
  213. make.height.mas_equalTo(adapt(40));
  214. }];
  215. return userView;
  216. }
  217. #pragma mark - 按钮事件
  218. /**
  219. * 换一换按钮点击
  220. */
  221. - (void)refreshButtonClicked {
  222. if (self.refreshBlock) {
  223. self.refreshBlock();
  224. }
  225. }
  226. /**
  227. * 发送打招呼按钮点击
  228. */
  229. - (void)sendGreetingButtonClicked {
  230. if (self.sendBlock) {
  231. self.sendBlock();
  232. }
  233. }
  234. #pragma mark - Lazy Loading
  235. - (UIView *)bgv {
  236. if (!_bgv) {
  237. _bgv = [[UIView alloc] init];
  238. _bgv.backgroundColor = UIColor.whiteColor;
  239. _bgv.layer.cornerRadius = adapt(16);
  240. _bgv.layer.masksToBounds = YES;
  241. _bgv.layer.shadowColor = HexColorFromRGB(0x000000).CGColor;
  242. _bgv.layer.shadowOpacity = 0.1;
  243. _bgv.layer.shadowOffset = CGSizeMake(0, 0);
  244. _bgv.layer.shadowRadius = adapt(8);
  245. [_bgv addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithActionBlock:^(id _Nonnull sender) { }]];
  246. }
  247. return _bgv;
  248. }
  249. /**
  250. * 换一换按钮
  251. */
  252. - (UIButton *)refreshBtn {
  253. if (!_refreshBtn) {
  254. _refreshBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  255. [_refreshBtn setTitle:@"换一批" forState:UIControlStateNormal];
  256. //[_refreshBtn setTitleColor:HexColorFromRGB(0xFD7BC5) forState:UIControlStateNormal];
  257. _refreshBtn.backgroundColor = HexColorFromRGB(0xFD7BC5);
  258. _refreshBtn.titleLabel.font = [UIFont systemFontOfSize:adapt(14)];
  259. _refreshBtn.layer.cornerRadius = adapt(13);
  260. _refreshBtn.layer.borderWidth = 1.0;
  261. _refreshBtn.layer.borderColor = HexColorFromRGB(0xFD7BC5).CGColor;
  262. [_refreshBtn addTarget:self action:@selector(refreshButtonClicked) forControlEvents:UIControlEventTouchUpInside];
  263. }
  264. return _refreshBtn;
  265. }
  266. /**
  267. * 用户容器视图
  268. */
  269. - (UIView *)userContainerView {
  270. if (!_userContainerView) {
  271. _userContainerView = [[UIView alloc] init];
  272. _userContainerView.backgroundColor = UIColor.clearColor;
  273. }
  274. return _userContainerView;
  275. }
  276. /**
  277. * 发送打招呼按钮
  278. */
  279. - (UIButton *)sendGreetingBtn {
  280. if (!_sendGreetingBtn) {
  281. _sendGreetingBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  282. [_sendGreetingBtn setTitle:@"打个招呼" forState:UIControlStateNormal];
  283. [_sendGreetingBtn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
  284. _sendGreetingBtn.titleLabel.font = [UIFont boldSystemFontOfSize:adapt(16)];
  285. _sendGreetingBtn.backgroundColor = HexColorFromRGB(0xFD7BC5);
  286. _sendGreetingBtn.layer.cornerRadius = adapt(25);
  287. [_sendGreetingBtn addTarget:self action:@selector(sendGreetingButtonClicked) forControlEvents:UIControlEventTouchUpInside];
  288. }
  289. return _sendGreetingBtn;
  290. }
  291. @end
  292. #pragma mark - YMGroupGreetingUserModel
  293. @implementation YMGroupGreetingUserModel
  294. /**
  295. * MJExtension 属性名替换
  296. */
  297. + (NSDictionary *)mj_replacedKeyFromPropertyName {
  298. return @{
  299. @"userId" : @"id"
  300. };
  301. }
  302. @end