200 lines
6.5 KiB
Objective-C
200 lines
6.5 KiB
Objective-C
//
|
||
// KBAIReplyCell.m
|
||
// keyBoard
|
||
//
|
||
// Created by Mac on 2026/1/16.
|
||
//
|
||
|
||
#import "KBAIReplyCell.h"
|
||
#import "KBAIReplyModel.h"
|
||
#import <Masonry/Masonry.h>
|
||
#import <SDWebImage/SDWebImage.h>
|
||
|
||
@interface KBAIReplyCell ()
|
||
|
||
@property(nonatomic, strong) UIImageView *avatarImageView;
|
||
@property(nonatomic, strong) UILabel *contentLabel;
|
||
@property(nonatomic, strong) UILabel *timeLabel;
|
||
@property(nonatomic, strong) UIButton *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.contentLabel];
|
||
[self.contentView addSubview:self.timeLabel];
|
||
[self.contentView addSubview:self.likeButton];
|
||
|
||
// 左侧缩进 48pt(对齐一级评论内容)
|
||
[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.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.left.equalTo(self.avatarImageView.mas_right).offset(8);
|
||
make.top.equalTo(self.avatarImageView);
|
||
make.right.equalTo(self.likeButton.mas_left).offset(-8);
|
||
}];
|
||
|
||
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.left.equalTo(self.contentLabel);
|
||
make.top.equalTo(self.contentLabel.mas_bottom).offset(4);
|
||
// 降低优先级,避免与 TableView 设置的固定高度约束冲突
|
||
make.bottom.equalTo(self.contentView).offset(-8).priority(MASLayoutPriorityDefaultHigh);
|
||
}];
|
||
|
||
[self.likeButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.right.equalTo(self.contentView).offset(-16);
|
||
make.top.equalTo(self.contentView).offset(8);
|
||
make.width.mas_equalTo(40);
|
||
make.height.mas_equalTo(30);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Configuration
|
||
|
||
- (void)configureWithReply:(KBAIReplyModel *)reply {
|
||
[self.avatarImageView
|
||
sd_setImageWithURL:[NSURL URLWithString:reply.avatarUrl]
|
||
placeholderImage:[UIImage imageNamed:@"default_avatar"]];
|
||
|
||
// 构建富文本:用户名(蓝色)+ @回复用户(蓝色)+ 内容
|
||
NSMutableAttributedString *attrText =
|
||
[[NSMutableAttributedString alloc] init];
|
||
|
||
// 用户名
|
||
NSDictionary *nameAttrs = @{
|
||
NSFontAttributeName : [UIFont systemFontOfSize:14
|
||
weight:UIFontWeightMedium],
|
||
NSForegroundColorAttributeName : [UIColor labelColor]
|
||
};
|
||
[attrText appendAttributedString:[[NSAttributedString alloc]
|
||
initWithString:reply.userName
|
||
attributes:nameAttrs]];
|
||
|
||
// @回复用户
|
||
if (reply.replyToUserName.length > 0) {
|
||
NSDictionary *replyAttrs = @{
|
||
NSFontAttributeName : [UIFont systemFontOfSize:14],
|
||
NSForegroundColorAttributeName : [UIColor systemBlueColor]
|
||
};
|
||
NSString *replyTo =
|
||
[NSString stringWithFormat:@" 回复 @%@", reply.replyToUserName];
|
||
[attrText appendAttributedString:[[NSAttributedString alloc]
|
||
initWithString:replyTo
|
||
attributes:replyAttrs]];
|
||
}
|
||
|
||
// 内容
|
||
NSDictionary *contentAttrs = @{
|
||
NSFontAttributeName : [UIFont systemFontOfSize:14],
|
||
NSForegroundColorAttributeName : [UIColor labelColor]
|
||
};
|
||
NSString *content = [NSString stringWithFormat:@":%@", reply.content];
|
||
[attrText appendAttributedString:[[NSAttributedString alloc]
|
||
initWithString:content
|
||
attributes:contentAttrs]];
|
||
|
||
self.contentLabel.attributedText = attrText;
|
||
|
||
// 时间
|
||
self.timeLabel.text = [reply formattedTime];
|
||
|
||
// 点赞
|
||
NSString *likeText =
|
||
reply.likeCount > 0 ? [self formatLikeCount:reply.likeCount] : @"";
|
||
[self.likeButton setTitle:likeText forState:UIControlStateNormal];
|
||
|
||
UIImage *likeImage = reply.isLiked ? [UIImage systemImageNamed:@"heart.fill"]
|
||
: [UIImage systemImageNamed:@"heart"];
|
||
[self.likeButton setImage:likeImage forState:UIControlStateNormal];
|
||
self.likeButton.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();
|
||
}
|
||
}
|
||
|
||
#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 *)contentLabel {
|
||
if (!_contentLabel) {
|
||
_contentLabel = [[UILabel alloc] init];
|
||
_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 *)likeButton {
|
||
if (!_likeButton) {
|
||
_likeButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
_likeButton.titleLabel.font = [UIFont systemFontOfSize:11];
|
||
[_likeButton setTitleColor:[UIColor grayColor]
|
||
forState:UIControlStateNormal];
|
||
[_likeButton setImage:[UIImage systemImageNamed:@"heart"]
|
||
forState:UIControlStateNormal];
|
||
_likeButton.tintColor = [UIColor grayColor];
|
||
[_likeButton addTarget:self
|
||
action:@selector(likeButtonTapped)
|
||
forControlEvents:UIControlEventTouchUpInside];
|
||
|
||
// 设置图片和文字间距
|
||
_likeButton.imageEdgeInsets = UIEdgeInsetsMake(0, -2, 0, 2);
|
||
_likeButton.titleEdgeInsets = UIEdgeInsetsMake(0, 2, 0, -2);
|
||
}
|
||
return _likeButton;
|
||
}
|
||
|
||
@end
|