// // YMGroupGreetingPopupView.m // MSYOUPAI // // Created by YoMi on 2024/12/19. // Copyright © 2024 MS. All rights reserved. // #import "YMGroupGreetingPopupView.h" #import @interface YMGroupGreetingPopupView () /** 换一换按钮 */ @property (nonatomic, strong) UIView *bgv; /** 换一换按钮 */ @property (nonatomic, strong) UIButton *refreshBtn; /** 用户容器视图 */ @property (nonatomic, strong) UIView *userContainerView; @property (nonatomic, assign) CGFloat userContainerViewHeight; /** 打个招呼按钮 */ @property (nonatomic, strong) UIButton *sendGreetingBtn; /** 用户列表数据 */ @property (nonatomic, strong) NSArray *userList; @end @implementation YMGroupGreetingPopupView /** * 初始化视图 */ - (void)ym_setupViews { self.backgroundColor = UIColor.clearColor; self.layer.cornerRadius = adapt(12); self.layer.masksToBounds = YES; self.userContainerViewHeight = adapt(120); // 默认 [self addSubview:self.bgv]; [self.bgv addSubview:self.refreshBtn]; [self.bgv addSubview:self.userContainerView]; [self.bgv addSubview:self.sendGreetingBtn]; [self setNeedsUpdateConstraints]; [self updateConstraintsIfNeeded]; [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithActionBlock:^(id _Nonnull sender) { if (self.clickBlankAreaBlock) { self.clickBlankAreaBlock(); } }]]; } /** * 更新约束 */ - (void)updateConstraints { [self.bgv mas_remakeConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self); make.width.mas_equalTo(kScreenWidth - adapt(40)); }]; [self.refreshBtn mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.bgv).offset(adapt(16)); make.right.equalTo(self.bgv).offset(adapt(-16)); make.width.mas_equalTo(adapt(70)); make.height.mas_equalTo(adapt(26)); }]; [self.userContainerView mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.refreshBtn.mas_bottom).offset(adapt(20)); make.left.equalTo(self.bgv).offset(adapt(20)); make.right.equalTo(self.bgv).offset(adapt(-20)); make.height.mas_equalTo(self.userContainerViewHeight); // 默认高度,会根据用户数量动态调整 }]; [self.sendGreetingBtn mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.userContainerView.mas_bottom).offset(adapt(20)); make.left.equalTo(self.bgv).offset(adapt(20)); make.right.equalTo(self.bgv).offset(adapt(-20)); make.bottom.equalTo(self.bgv).offset(adapt(-20)); make.height.mas_equalTo(adapt(50)); }]; [super updateConstraints]; } /** * 配置用户列表数据 */ - (void)configureWithUserList:(NSArray *)userList { self.userList = userList; [self setupUserViews]; [self updateConstraints]; } /** * 设置用户视图 */ - (void)setupUserViews { // 清除之前的子视图 for (UIView *subview in self.userContainerView.subviews) { [subview removeFromSuperview]; } NSInteger userCount = self.userList.count; if (userCount == 0) return; // 限制最多显示5个用户 userCount = MIN(userCount, 6); CGFloat avatarSize = (kScreenWidth - (adapt(40) * 4)) / 3; CGFloat spacing = adapt(40); CGFloat containerWidth = kScreenWidth - adapt(40); // 减去左右边距 // 根据用户数量决定布局 [self setupLayoutWithCount:userCount avatarSize:avatarSize spacing:spacing containerWidth:containerWidth]; self.userContainerViewHeight = (avatarSize + adapt(40)) * (userCount / 3 + (userCount % 3 == 0 ? 0 : 1)); } - (void)setupLayoutWithCount:(NSInteger)count avatarSize:(CGFloat)avatarSize spacing:(CGFloat)spacing containerWidth:(CGFloat)containerWidth { NSInteger rowCount = count / 3 + (count % 3 == 0 ? 0 : 1); CGFloat startX = 0; for (NSInteger i = 0; i < rowCount; i ++) { for (NSInteger j = 0; j < 3; j ++) { NSInteger index = i * 3 + j; if (index >= count) { break; } YMGroupGreetingUserModel *user = self.userList[index]; UIView *userView = [self createUserViewWithModel:user]; [self.userContainerView addSubview:userView]; [userView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.userContainerView).offset(i * (avatarSize + adapt(40))); make.left.equalTo(self.userContainerView).offset(startX + j * (avatarSize + spacing)); make.width.mas_equalTo(avatarSize); make.height.mas_equalTo(avatarSize + adapt(40)); }]; } } } /** * 单行布局 */ - (void)setupSingleRowLayoutWithCount:(NSInteger)count avatarSize:(CGFloat)avatarSize spacing:(CGFloat)spacing containerWidth:(CGFloat)containerWidth { //CGFloat totalWidth = count * avatarSize + (count - 1) * spacing; CGFloat startX = 0; for (NSInteger i = 0; i < count; i++) { YMGroupGreetingUserModel *user = self.userList[i]; UIView *userView = [self createUserViewWithModel:user]; [self.userContainerView addSubview:userView]; [userView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.userContainerView).offset(startX + i * (avatarSize + spacing)); make.top.equalTo(self.userContainerView); make.width.mas_equalTo(avatarSize); make.height.mas_equalTo(avatarSize + adapt(40)); }]; } } /** * 双行布局 */ - (void)setupDoubleRowLayoutWithCount:(NSInteger)count avatarSize:(CGFloat)avatarSize spacing:(CGFloat)spacing containerWidth:(CGFloat)containerWidth { NSInteger firstRowCount = (count + 1) / 2; // 第一行用户数 NSInteger secondRowCount = count - firstRowCount; // 第二行用户数 // 第一行 //CGFloat firstRowTotalWidth = firstRowCount * avatarSize + (firstRowCount - 1) * spacing; CGFloat firstRowStartX = 0; for (NSInteger i = 0; i < firstRowCount; i++) { YMGroupGreetingUserModel *user = self.userList[i]; UIView *userView = [self createUserViewWithModel:user]; [self.userContainerView addSubview:userView]; [userView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.userContainerView).offset(firstRowStartX + i * (avatarSize + spacing)); make.top.equalTo(self.userContainerView); make.width.mas_equalTo(avatarSize); make.height.mas_equalTo(avatarSize + adapt(40)); }]; } // 第二行 if (secondRowCount > 0) { //CGFloat secondRowTotalWidth = secondRowCount * avatarSize + (secondRowCount - 1) * spacing; //CGFloat secondRowStartX = 0 + avatarSize + adapt(20) - (avatarSize / 2.0); CGFloat secondRowStartX = 0; for (NSInteger i = 0; i < secondRowCount; i++) { YMGroupGreetingUserModel *user = self.userList[firstRowCount + i]; UIView *userView = [self createUserViewWithModel:user]; [self.userContainerView addSubview:userView]; [userView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.userContainerView).offset(secondRowStartX + i * (avatarSize + spacing)); make.top.equalTo(self.userContainerView).offset(avatarSize + adapt(40)); make.width.mas_equalTo(avatarSize); make.height.mas_equalTo(avatarSize + adapt(40)); }]; } } } /** * 创建用户视图 */ - (UIView *)createUserViewWithModel:(YMGroupGreetingUserModel *)user { CGFloat avatarSize = (kScreenWidth - (adapt(40) * 4)) / 3; UIView *userView = [[UIView alloc] init]; // 头像 UIImageView *avatarImageView = [[UIImageView alloc] init]; avatarImageView.layer.cornerRadius = avatarSize / 2.0; avatarImageView.layer.masksToBounds = YES; avatarImageView.backgroundColor = HexColorFromRGB(0xF5F5F5); avatarImageView.contentMode = UIViewContentModeScaleAspectFill; // 设置头像 if (user.avatar.length > 0) { NSURL *avatarURL = [LCTools getImageUrlWithAddress:user.avatar]; [avatarImageView sd_setImageWithURL:avatarURL placeholderImage:[UIImage imageNamed:@"vqu_images_P_man"]]; } else { avatarImageView.image = [UIImage imageNamed:@"vqu_images_P_man"]; } [userView addSubview:avatarImageView]; // 昵称 UILabel *nicknameLabel = [[UILabel alloc] init]; nicknameLabel.text = user.nickname.length > 0 ? user.nickname : @"用户"; nicknameLabel.font = [UIFont systemFontOfSize:adapt(10)]; nicknameLabel.textColor = HexColorFromRGB(0x333333); nicknameLabel.textAlignment = NSTextAlignmentCenter; nicknameLabel.lineBreakMode = NSLineBreakByTruncatingTail; [userView addSubview:nicknameLabel]; // 约束 [avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.centerX.equalTo(userView); make.width.height.mas_equalTo(avatarSize); }]; [nicknameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(avatarImageView.mas_bottom).offset(adapt(0)); make.left.right.equalTo(userView); make.height.mas_equalTo(adapt(40)); }]; return userView; } #pragma mark - 按钮事件 /** * 换一换按钮点击 */ - (void)refreshButtonClicked { if (self.refreshBlock) { self.refreshBlock(); } } /** * 发送打招呼按钮点击 */ - (void)sendGreetingButtonClicked { if (self.sendBlock) { self.sendBlock(); } } #pragma mark - Lazy Loading - (UIView *)bgv { if (!_bgv) { _bgv = [[UIView alloc] init]; _bgv.backgroundColor = UIColor.whiteColor; _bgv.layer.cornerRadius = adapt(16); _bgv.layer.masksToBounds = YES; _bgv.layer.shadowColor = HexColorFromRGB(0x000000).CGColor; _bgv.layer.shadowOpacity = 0.1; _bgv.layer.shadowOffset = CGSizeMake(0, 0); _bgv.layer.shadowRadius = adapt(8); [_bgv addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithActionBlock:^(id _Nonnull sender) { }]]; } return _bgv; } /** * 换一换按钮 */ - (UIButton *)refreshBtn { if (!_refreshBtn) { _refreshBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [_refreshBtn setTitle:@"换一批" forState:UIControlStateNormal]; //[_refreshBtn setTitleColor:HexColorFromRGB(0xFD7BC5) forState:UIControlStateNormal]; _refreshBtn.backgroundColor = HexColorFromRGB(0xFD7BC5); _refreshBtn.titleLabel.font = [UIFont systemFontOfSize:adapt(14)]; _refreshBtn.layer.cornerRadius = adapt(13); _refreshBtn.layer.borderWidth = 1.0; _refreshBtn.layer.borderColor = HexColorFromRGB(0xFD7BC5).CGColor; [_refreshBtn addTarget:self action:@selector(refreshButtonClicked) forControlEvents:UIControlEventTouchUpInside]; } return _refreshBtn; } /** * 用户容器视图 */ - (UIView *)userContainerView { if (!_userContainerView) { _userContainerView = [[UIView alloc] init]; _userContainerView.backgroundColor = UIColor.clearColor; } return _userContainerView; } /** * 发送打招呼按钮 */ - (UIButton *)sendGreetingBtn { if (!_sendGreetingBtn) { _sendGreetingBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [_sendGreetingBtn setTitle:@"打个招呼" forState:UIControlStateNormal]; [_sendGreetingBtn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; _sendGreetingBtn.titleLabel.font = [UIFont boldSystemFontOfSize:adapt(16)]; _sendGreetingBtn.backgroundColor = HexColorFromRGB(0xFD7BC5); _sendGreetingBtn.layer.cornerRadius = adapt(25); [_sendGreetingBtn addTarget:self action:@selector(sendGreetingButtonClicked) forControlEvents:UIControlEventTouchUpInside]; } return _sendGreetingBtn; } @end #pragma mark - YMGroupGreetingUserModel @implementation YMGroupGreetingUserModel /** * MJExtension 属性名替换 */ + (NSDictionary *)mj_replacedKeyFromPropertyName { return @{ @"userId" : @"id" }; } @end