YMGroupGreetingPopupView.m 12 KB

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