Files
keyboard/keyBoard/Class/AiTalk/V/KBAIReplyCell.m
2026-01-16 20:31:42 +08:00

238 lines
7.9 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// KBAIReplyCell.m
// keyBoard
//
// Created by Mac on 2026/1/16.
//
#import "KBAIReplyCell.h"
#import "KBAIReplyModel.h"
#import "KBTopImageButton.h"
#import <Masonry/Masonry.h>
#import <SDWebImage/SDWebImage.h>
@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 whiteColor];
[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