// // KBAIReplyCell.m // keyBoard // // Created by Mac on 2026/1/16. // #import "KBAIReplyCell.h" #import "KBAIReplyModel.h" #import "KBTopImageButton.h" #import #import @interface KBAIReplyCell () @property(nonatomic, strong) UIImageView *avatarImageView; @property(nonatomic, strong) UILabel *userNameLabel; @property(nonatomic, strong) UILabel *contentLabel; @property(nonatomic, strong) UILabel *timeLabel; @property(nonatomic, strong) UIButton *replyButton; @property(nonatomic, strong) KBTopImageButton *likeButton; @end @implementation KBAIReplyCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.selectionStyle = UITableViewCellSelectionStyleNone; self.backgroundColor = [UIColor clearColor]; self.contentView.backgroundColor = [UIColor clearColor]; [self setupUI]; } return self; } #pragma mark - UI Setup - (void)setupUI { [self.contentView addSubview:self.avatarImageView]; [self.contentView addSubview:self.userNameLabel]; [self.contentView addSubview:self.contentLabel]; [self.contentView addSubview:self.timeLabel]; [self.contentView addSubview:self.replyButton]; [self.contentView addSubview:self.likeButton]; // 左侧缩进(对齐一级评论内容) [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.contentView).offset(68); // 16 + 40 + 12 = 68 make.top.equalTo(self.contentView).offset(8); make.width.height.mas_equalTo(28); }]; [self.userNameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.avatarImageView.mas_right).offset(8); make.top.equalTo(self.avatarImageView); make.right.equalTo(self.contentView).offset(-50); }]; [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.userNameLabel); make.top.equalTo(self.contentLabel.mas_bottom).offset(6); make.bottom.equalTo(self.contentView).offset(-8).priority(MASLayoutPriorityDefaultHigh); }]; [self.replyButton mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.timeLabel.mas_right).offset(16); make.centerY.equalTo(self.timeLabel); }]; [self.likeButton mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.contentView).offset(-16); make.top.equalTo(self.contentView).offset(8); make.width.mas_equalTo(30); make.height.mas_equalTo(30); }]; [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.userNameLabel); make.top.equalTo(self.userNameLabel.mas_bottom).offset(4); make.right.equalTo(self.likeButton.mas_left).offset(-5); }]; } #pragma mark - Configuration - (void)configureWithReply:(KBAIReplyModel *)reply { [self.avatarImageView sd_setImageWithURL:[NSURL URLWithString:reply.avatarUrl] placeholderImage:[UIImage imageNamed:@"default_avatar"]]; // 用户名(如果有回复对象,显示 "用户名 回复 @被回复用户") if (reply.replyToUserName.length > 0) { NSMutableAttributedString *attrName = [[NSMutableAttributedString alloc] init]; NSDictionary *nameAttrs = @{ NSFontAttributeName : [UIFont systemFontOfSize:13 weight:UIFontWeightMedium], NSForegroundColorAttributeName : [UIColor secondaryLabelColor] }; [attrName appendAttributedString:[[NSAttributedString alloc] initWithString:reply.userName attributes:nameAttrs]]; NSDictionary *replyAttrs = @{ NSFontAttributeName : [UIFont systemFontOfSize:13], NSForegroundColorAttributeName : [UIColor secondaryLabelColor] }; [attrName appendAttributedString:[[NSAttributedString alloc] initWithString:@" 回复 " attributes:replyAttrs]]; NSDictionary *toUserAttrs = @{ NSFontAttributeName : [UIFont systemFontOfSize:13], NSForegroundColorAttributeName : [UIColor systemBlueColor] }; [attrName appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"@%@", reply.replyToUserName] attributes:toUserAttrs]]; self.userNameLabel.attributedText = attrName; } else { self.userNameLabel.attributedText = nil; self.userNameLabel.text = reply.userName; } // 评论内容 self.contentLabel.text = reply.content; // 时间 self.timeLabel.text = [reply formattedTime]; // 点赞 NSString *likeText = reply.likeCount > 0 ? [self formatLikeCount:reply.likeCount] : @""; self.likeButton.textLabel.text = likeText; UIImage *likeImage = reply.isLiked ? [UIImage systemImageNamed:@"heart.fill"] : [UIImage systemImageNamed:@"heart"]; self.likeButton.iconView.image = likeImage; self.likeButton.iconView.tintColor = reply.isLiked ? [UIColor systemRedColor] : [UIColor grayColor]; } - (NSString *)formatLikeCount:(NSInteger)count { if (count >= 10000) { return [NSString stringWithFormat:@"%.1fw", count / 10000.0]; } else if (count >= 1000) { return [NSString stringWithFormat:@"%.1fk", count / 1000.0]; } return [NSString stringWithFormat:@"%ld", (long)count]; } #pragma mark - Actions - (void)likeButtonTapped { if (self.onLikeAction) { self.onLikeAction(); } } - (void)replyButtonTapped { if (self.onReplyAction) { self.onReplyAction(); } } #pragma mark - Lazy Loading - (UIImageView *)avatarImageView { if (!_avatarImageView) { _avatarImageView = [[UIImageView alloc] init]; _avatarImageView.contentMode = UIViewContentModeScaleAspectFill; _avatarImageView.layer.cornerRadius = 14; _avatarImageView.layer.masksToBounds = YES; _avatarImageView.backgroundColor = [UIColor systemGray5Color]; } return _avatarImageView; } - (UILabel *)userNameLabel { if (!_userNameLabel) { _userNameLabel = [[UILabel alloc] init]; _userNameLabel.font = [UIFont systemFontOfSize:13 weight:UIFontWeightMedium]; _userNameLabel.textColor = [UIColor secondaryLabelColor]; _userNameLabel.numberOfLines = 0; } return _userNameLabel; } - (UILabel *)contentLabel { if (!_contentLabel) { _contentLabel = [[UILabel alloc] init]; _contentLabel.font = [UIFont systemFontOfSize:14]; _contentLabel.textColor = [UIColor labelColor]; _contentLabel.numberOfLines = 0; } return _contentLabel; } - (UILabel *)timeLabel { if (!_timeLabel) { _timeLabel = [[UILabel alloc] init]; _timeLabel.font = [UIFont systemFontOfSize:11]; _timeLabel.textColor = [UIColor secondaryLabelColor]; } return _timeLabel; } - (UIButton *)replyButton { if (!_replyButton) { _replyButton = [UIButton buttonWithType:UIButtonTypeCustom]; _replyButton.titleLabel.font = [UIFont systemFontOfSize:11]; [_replyButton setTitle:@"回复" forState:UIControlStateNormal]; [_replyButton setTitleColor:[UIColor secondaryLabelColor] forState:UIControlStateNormal]; [_replyButton addTarget:self action:@selector(replyButtonTapped) forControlEvents:UIControlEventTouchUpInside]; } return _replyButton; } - (KBTopImageButton *)likeButton { if (!_likeButton) { _likeButton = [[KBTopImageButton alloc] init]; _likeButton.iconSize = CGSizeMake(16, 16); _likeButton.spacing = 2; _likeButton.iconView.image = [UIImage systemImageNamed:@"heart"]; _likeButton.iconView.tintColor = [UIColor grayColor]; _likeButton.textLabel.font = [UIFont systemFontOfSize:10]; _likeButton.textLabel.textColor = [UIColor grayColor]; [_likeButton addTarget:self action:@selector(likeButtonTapped) forControlEvents:UIControlEventTouchUpInside]; } return _likeButton; } @end