
- 创建 NewMomentViewController(OC) * 列表式布局 + 下拉刷新 + 滚动加载 * 发布按钮(右下角悬浮) * 使用模拟数据 - 创建 NewMomentCell(OC) * 卡片式设计(白色卡片 + 阴影) * 圆角矩形头像(不是圆形!) * 底部操作栏(点赞/评论/分享) - 创建 NewMineViewController(OC) * TableView 布局 + 8 个菜单项 * 设置按钮(右上角) - 创建 NewMineHeaderView(OC) * 渐变背景(蓝色系) * 圆角矩形头像 + 白色边框 * 昵称、等级、经验进度条 * 关注/粉丝统计 * 纵向卡片式设计 - 集成到 NewTabBarController * 使用真实的 ViewController 替换占位 * 支持登录前/后状态切换 - 更新 Bridging Header * 添加新模块的 OC 类引用 - 创建测试指南文档 * 如何运行新 TabBar * 测试清单 * 常见问题解答 新增文件: - NewMomentViewController.h/m - NewMomentCell.h/m - NewMineViewController.h/m - NewMineHeaderView.h/m - white-label-test-guide.md 代码量:约 1500 行
277 lines
8.6 KiB
Objective-C
277 lines
8.6 KiB
Objective-C
//
|
|
// NewMomentCell.m
|
|
// YuMi
|
|
//
|
|
// Created by AI on 2025-10-09.
|
|
// Copyright © 2025 YuMi. All rights reserved.
|
|
//
|
|
|
|
#import "NewMomentCell.h"
|
|
#import <Masonry/Masonry.h>
|
|
|
|
@interface NewMomentCell ()
|
|
|
|
// MARK: - UI Components
|
|
|
|
/// 卡片容器
|
|
@property (nonatomic, strong) UIView *cardView;
|
|
|
|
/// 头像
|
|
@property (nonatomic, strong) UIImageView *avatarImageView;
|
|
|
|
/// 用户名
|
|
@property (nonatomic, strong) UILabel *nameLabel;
|
|
|
|
/// 时间标签
|
|
@property (nonatomic, strong) UILabel *timeLabel;
|
|
|
|
/// 内容标签
|
|
@property (nonatomic, strong) UILabel *contentLabel;
|
|
|
|
/// 图片容器(可选)
|
|
@property (nonatomic, strong) UIView *imagesContainer;
|
|
|
|
/// 底部操作栏
|
|
@property (nonatomic, strong) UIView *actionBar;
|
|
|
|
/// 点赞按钮
|
|
@property (nonatomic, strong) UIButton *likeButton;
|
|
|
|
/// 评论按钮
|
|
@property (nonatomic, strong) UIButton *commentButton;
|
|
|
|
/// 分享按钮
|
|
@property (nonatomic, strong) UIButton *shareButton;
|
|
|
|
@end
|
|
|
|
@implementation NewMomentCell
|
|
|
|
// MARK: - Lifecycle
|
|
|
|
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
|
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
|
|
self.selectionStyle = UITableViewCellSelectionStyleNone;
|
|
self.backgroundColor = [UIColor clearColor];
|
|
[self setupUI];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
// MARK: - Setup UI
|
|
|
|
- (void)setupUI {
|
|
// 卡片容器(圆角矩形 + 阴影)
|
|
[self.contentView addSubview:self.cardView];
|
|
[self.cardView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.equalTo(self.contentView).offset(15);
|
|
make.right.equalTo(self.contentView).offset(-15);
|
|
make.top.equalTo(self.contentView).offset(8);
|
|
make.bottom.equalTo(self.contentView).offset(-8);
|
|
}];
|
|
|
|
// 头像(圆角矩形,不是圆形!)
|
|
[self.cardView addSubview:self.avatarImageView];
|
|
[self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.equalTo(self.cardView).offset(15);
|
|
make.top.equalTo(self.cardView).offset(15);
|
|
make.size.mas_equalTo(CGSizeMake(40, 40));
|
|
}];
|
|
|
|
// 用户名
|
|
[self.cardView addSubview:self.nameLabel];
|
|
[self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.equalTo(self.avatarImageView.mas_right).offset(10);
|
|
make.top.equalTo(self.avatarImageView);
|
|
make.right.equalTo(self.cardView).offset(-15);
|
|
}];
|
|
|
|
// 时间
|
|
[self.cardView addSubview:self.timeLabel];
|
|
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.equalTo(self.nameLabel);
|
|
make.bottom.equalTo(self.avatarImageView);
|
|
make.right.equalTo(self.cardView).offset(-15);
|
|
}];
|
|
|
|
// 内容
|
|
[self.cardView addSubview:self.contentLabel];
|
|
[self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.equalTo(self.cardView).offset(15);
|
|
make.right.equalTo(self.cardView).offset(-15);
|
|
make.top.equalTo(self.avatarImageView.mas_bottom).offset(12);
|
|
}];
|
|
|
|
// 底部操作栏
|
|
[self.cardView addSubview:self.actionBar];
|
|
[self.actionBar mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.right.equalTo(self.cardView);
|
|
make.top.equalTo(self.contentLabel.mas_bottom).offset(15);
|
|
make.height.mas_equalTo(50);
|
|
make.bottom.equalTo(self.cardView).offset(-8);
|
|
}];
|
|
|
|
// 点赞按钮
|
|
[self.actionBar addSubview:self.likeButton];
|
|
[self.likeButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.equalTo(self.actionBar).offset(15);
|
|
make.centerY.equalTo(self.actionBar);
|
|
make.width.mas_greaterThanOrEqualTo(60);
|
|
}];
|
|
|
|
// 评论按钮
|
|
[self.actionBar addSubview:self.commentButton];
|
|
[self.commentButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerX.equalTo(self.actionBar);
|
|
make.centerY.equalTo(self.actionBar);
|
|
make.width.mas_greaterThanOrEqualTo(60);
|
|
}];
|
|
|
|
// 分享按钮
|
|
[self.actionBar addSubview:self.shareButton];
|
|
[self.shareButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.right.equalTo(self.actionBar).offset(-15);
|
|
make.centerY.equalTo(self.actionBar);
|
|
make.width.mas_greaterThanOrEqualTo(60);
|
|
}];
|
|
}
|
|
|
|
// MARK: - Public Methods
|
|
|
|
- (void)configureWithData:(NSDictionary *)data {
|
|
// 配置用户名
|
|
self.nameLabel.text = data[@"userName"] ?: @"匿名用户";
|
|
|
|
// 配置时间
|
|
self.timeLabel.text = @"2小时前"; // TODO: 实际计算时间
|
|
|
|
// 配置内容
|
|
self.contentLabel.text = data[@"content"] ?: @"";
|
|
|
|
// 配置点赞数
|
|
NSNumber *likeCount = data[@"likeCount"];
|
|
[self.likeButton setTitle:[NSString stringWithFormat:@"👍 %@", likeCount ?: @"0"] forState:UIControlStateNormal];
|
|
|
|
// 配置评论数
|
|
NSNumber *commentCount = data[@"commentCount"];
|
|
[self.commentButton setTitle:[NSString stringWithFormat:@"💬 %@", commentCount ?: @"0"] forState:UIControlStateNormal];
|
|
|
|
// 配置分享
|
|
[self.shareButton setTitle:@"🔗 分享" forState:UIControlStateNormal];
|
|
}
|
|
|
|
// MARK: - Actions
|
|
|
|
- (void)onLikeButtonTapped {
|
|
NSLog(@"[NewMomentCell] 点赞");
|
|
// TODO: 实现点赞逻辑
|
|
}
|
|
|
|
- (void)onCommentButtonTapped {
|
|
NSLog(@"[NewMomentCell] 评论");
|
|
// TODO: 实现评论逻辑
|
|
}
|
|
|
|
- (void)onShareButtonTapped {
|
|
NSLog(@"[NewMomentCell] 分享");
|
|
// TODO: 实现分享逻辑
|
|
}
|
|
|
|
// MARK: - Lazy Loading
|
|
|
|
- (UIView *)cardView {
|
|
if (!_cardView) {
|
|
_cardView = [[UIView alloc] init];
|
|
_cardView.backgroundColor = [UIColor whiteColor];
|
|
_cardView.layer.cornerRadius = 12; // 圆角
|
|
_cardView.layer.shadowColor = [UIColor blackColor].CGColor;
|
|
_cardView.layer.shadowOffset = CGSizeMake(0, 2);
|
|
_cardView.layer.shadowOpacity = 0.1;
|
|
_cardView.layer.shadowRadius = 8;
|
|
_cardView.layer.masksToBounds = NO;
|
|
}
|
|
return _cardView;
|
|
}
|
|
|
|
- (UIImageView *)avatarImageView {
|
|
if (!_avatarImageView) {
|
|
_avatarImageView = [[UIImageView alloc] init];
|
|
_avatarImageView.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
|
|
_avatarImageView.layer.cornerRadius = 8; // 圆角矩形,不是圆形!
|
|
_avatarImageView.layer.masksToBounds = YES;
|
|
_avatarImageView.contentMode = UIViewContentModeScaleAspectFill;
|
|
}
|
|
return _avatarImageView;
|
|
}
|
|
|
|
- (UILabel *)nameLabel {
|
|
if (!_nameLabel) {
|
|
_nameLabel = [[UILabel alloc] init];
|
|
_nameLabel.font = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium];
|
|
_nameLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.0];
|
|
}
|
|
return _nameLabel;
|
|
}
|
|
|
|
- (UILabel *)timeLabel {
|
|
if (!_timeLabel) {
|
|
_timeLabel = [[UILabel alloc] init];
|
|
_timeLabel.font = [UIFont systemFontOfSize:12];
|
|
_timeLabel.textColor = [UIColor colorWithWhite:0.6 alpha:1.0];
|
|
}
|
|
return _timeLabel;
|
|
}
|
|
|
|
- (UILabel *)contentLabel {
|
|
if (!_contentLabel) {
|
|
_contentLabel = [[UILabel alloc] init];
|
|
_contentLabel.font = [UIFont systemFontOfSize:15];
|
|
_contentLabel.textColor = [UIColor colorWithWhite:0.3 alpha:1.0];
|
|
_contentLabel.numberOfLines = 0;
|
|
_contentLabel.lineBreakMode = NSLineBreakByWordWrapping;
|
|
}
|
|
return _contentLabel;
|
|
}
|
|
|
|
- (UIView *)actionBar {
|
|
if (!_actionBar) {
|
|
_actionBar = [[UIView alloc] init];
|
|
_actionBar.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1.0];
|
|
}
|
|
return _actionBar;
|
|
}
|
|
|
|
- (UIButton *)likeButton {
|
|
if (!_likeButton) {
|
|
_likeButton = [self createActionButtonWithTitle:@"👍 0"];
|
|
[_likeButton addTarget:self action:@selector(onLikeButtonTapped) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _likeButton;
|
|
}
|
|
|
|
- (UIButton *)commentButton {
|
|
if (!_commentButton) {
|
|
_commentButton = [self createActionButtonWithTitle:@"💬 0"];
|
|
[_commentButton addTarget:self action:@selector(onCommentButtonTapped) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _commentButton;
|
|
}
|
|
|
|
- (UIButton *)shareButton {
|
|
if (!_shareButton) {
|
|
_shareButton = [self createActionButtonWithTitle:@"🔗 分享"];
|
|
[_shareButton addTarget:self action:@selector(onShareButtonTapped) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _shareButton;
|
|
}
|
|
|
|
- (UIButton *)createActionButtonWithTitle:(NSString *)title {
|
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
|
|
[button setTitle:title forState:UIControlStateNormal];
|
|
button.titleLabel.font = [UIFont systemFontOfSize:13];
|
|
[button setTitleColor:[UIColor colorWithWhite:0.5 alpha:1.0] forState:UIControlStateNormal];
|
|
return button;
|
|
}
|
|
|
|
@end
|