仿微信评论回复(简易)

 
 

https://www.jianshu.com/p/0061df465650

先说说大概逻辑,一个控制器里添加列表(类似朋友圈的每条动态),每个动态里面再添加一个列表(用来显示所有评论以及点击回复评论),都是用Masonry布局加HYBMasonryAutoCellHeight自适应行高来完成,键盘是随便找的一个第三方,而且项目里也没重点设置

先看看大概的界面以及两个模型里面的属性

1.png
2.png
3.png

下面是viewController里面代码,这里把回复的人的名字定死了,有数据的话可以根据实际情况来定

#import "ViewController.h"
#import "Masonry.h"
#import "UITableViewCell+HYBMasonryAutoCellHeight.h"
#import "TableViewCell.h"
#import "ComentModel.h"
#import "AllComentModel.h"

#import "ChatKeyBoard.h"
#define KSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define KSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,ChatKeyBoardDelegate,TableviewCellDelegate>

@property (nonatomic, strong) UITableView *tableview;

@property (nonatomic, strong) NSArray *allMessage;

@property (nonatomic, strong) ChatKeyBoard *chatKeyBoard;

@property (nonatomic, strong) NSIndexPath *myIndexPath;

//回复给谁
@property (nonatomic, strong) NSString *name;

@end

@implementation ViewController

-(ChatKeyBoard *)chatKeyBoard{
    if (_chatKeyBoard==nil) {
        _chatKeyBoard =[ChatKeyBoard keyBoardWithNavgationBarTranslucent:YES];
        _chatKeyBoard.delegate = self;
        _chatKeyBoard.keyBoardStyle = KeyBoardStyleComment;
        _chatKeyBoard.allowVoice = NO;
        _chatKeyBoard.allowMore = NO;
        _chatKeyBoard.allowFace = NO;
        _chatKeyBoard.allowSwitchBar = NO;
        _chatKeyBoard.placeHolder = @"评论";
        [self.view addSubview:_chatKeyBoard];
        [self.view bringSubviewToFront:_chatKeyBoard];
    }
    return _chatKeyBoard;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.tableview = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, KSCREEN_WIDTH, KSCREEN_HEIGHT-64) style:UITableViewStylePlain];
    self.tableview.delegate = self;
    self.tableview.dataSource = self;
    [self.view addSubview:self.tableview];

    AllComentModel *coment = [AllComentModel new];
    
    ComentModel *model = [ComentModel new];
    model.startPeople = @"马云";
    model.remarkText = @"钱太多花不完怎么办";
    model.remarkPeople = @"";
    ComentModel *model1 = [ComentModel new];
    model1.startPeople = @"大师兄";
    model1.remarkText = @"真羡慕你们这么年纪轻轻就认识像我这么有才华的人";
    coment.allComents = @[model,model1];
    model1.remarkPeople = @"";
    AllComentModel *coment1 = [AllComentModel new];
    
    coment1.allComents = @[model,model1];
    
    self.allMessage = @[coment,coment1];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self.chatKeyBoard keyboardUpforComment];
}

#pragma mark --
#pragma mark -- UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.allMessage.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        cell.delegate = self;
    }
    [cell configCellWithModel:self.allMessage[indexPath.row] indexPath:indexPath];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [TableViewCell hyb_heightForTableView:tableView config:^(UITableViewCell *sourceCell) {
        TableViewCell *cell = (TableViewCell *)sourceCell;
        [cell configCellWithModel:self.allMessage[indexPath.row] indexPath:indexPath];
    }];
}

#pragma mark -- TableViewCellDelegate
- (void)clickCellWithModel:(ComentModel *)model andIndex:(NSIndexPath *)indexPath {
    if (![model.remarkPeople isEqualToString:@""]) {
        self.chatKeyBoard.placeHolder = [NSString stringWithFormat:@"回复%@:",model.remarkPeople];
    }else {
        self.chatKeyBoard.placeHolder = [NSString stringWithFormat:@"回复%@:",model.startPeople];
    }
    self.name = model.startPeople;
    [self.chatKeyBoard keyboardUpforComment];
    self.myIndexPath = indexPath;
}

//发送
- (void)chatKeyBoardSendText:(NSString *)text{
    [self.chatKeyBoard keyboardDownForComment];
    
    AllComentModel *model = self.allMessage[self.myIndexPath.row];
//评论人model,评论人名写死了
    ComentModel *commodel = [ComentModel new];
    commodel.startPeople = self.name;
    commodel.remarkText = text;
    commodel.remarkPeople = @"马化腾";
    NSMutableArray *mtAry = [NSMutableArray arrayWithArray:model.allComents];
    [mtAry addObject:commodel];
    model.allComents = mtAry.mutableCopy;
    
    [self.tableview reloadRowsAtIndexPaths:@[self.myIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}

下面是第一个tableViewCell的.h和.m

#import <UIKit/UIKit.h>
#import "ComentModel.h"
#import "AllComentModel.h"

@class TableViewCell;

@protocol TableviewCellDelegate <NSObject>

- (void)clickCellWithModel:(ComentModel *)model andIndex:(NSIndexPath *)indexPath;

@end

@interface TableViewCell : UITableViewCell

@property (nonatomic, weak) id<TableviewCellDelegate> delegate;

@property (nonatomic, strong) UITableView *tableView;

- (void)configCellWithModel:(AllComentModel *)model indexPath:(NSIndexPath *)indexPath;

@end
#import "TableViewCell.h"
#import "Masonry.h"
#import "UITableViewCell+HYBMasonryAutoCellHeight.h"
#import "MessageCell.h"
#import "AllComentModel.h"

#define kGAP 10
@interface TableViewCell ()<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic, strong) NSIndexPath *indexPath;

@property (nonatomic, strong) AllComentModel *allComents;

@end

@implementation TableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        self.backgroundColor = [UIColor lightGrayColor];
        
        self.tableView = [[UITableView alloc] init];
        
        self.tableView.scrollEnabled = NO;
        [self.contentView addSubview:self.tableView];
        [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(kGAP);
            make.top.mas_equalTo(kGAP);
            make.right.mas_equalTo(-kGAP);
        }];
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self.hyb_lastViewInCell = self.tableView;
        self.hyb_bottomOffsetToCell = 0.0;
    }
    return self;
}

- (void)configCellWithModel:(AllComentModel *)model indexPath:(NSIndexPath *)indexPath {
    CGFloat tableviewHeight = 0;
    self.allComents = model;
    self.indexPath = indexPath;
    
    for (ComentModel *comentModel in model.allComents) {
        CGFloat cellheight = [MessageCell hyb_heightForTableView:self.tableView config:^(UITableViewCell *sourceCell) {
            MessageCell *cell = (MessageCell *)sourceCell;
            [cell configCellWithModel:comentModel];
        }];
        tableviewHeight += cellheight;
    }
    
    [self.tableView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(tableviewHeight);
    }];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView reloadData];
}

#pragma mark --
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.allComents.allComents.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (!cell) {
        cell = [[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }
    ComentModel *model = self.allComents.allComents[indexPath.row];
    [cell configCellWithModel:model];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    ComentModel *model = self.allComents.allComents[indexPath.row];
    CGFloat cell_height = [MessageCell hyb_heightForTableView:tableView config:^(UITableViewCell *sourceCell) {
        MessageCell *cell = (MessageCell *)sourceCell;
        [cell configCellWithModel:model];
    } cache:^NSDictionary *{
        NSDictionary *cache = @{kHYBCacheUniqueKey : @"",
                                kHYBCacheStateKey : @"",
                                kHYBRecalculateForStateKey : @(YES)};
        return cache;
    }];
    return cell_height;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //当点击到自己回复的语句时,微信是弹出删除功能,需要的也可以自己加上去
    ComentModel *model = self.allComents.allComents[indexPath.row];
    if ([model.remarkPeople isEqualToString:@"马化腾"]) {
        NSLog(@"点击了自己的回复");
        return;
    }
    
    if ([self.delegate respondsToSelector:@selector(clickCellWithModel:andIndex:)]) {
        [self.delegate clickCellWithModel:model andIndex:self.indexPath];
    }
}

下面是主列表里面包含的评论列表的.h和.m

#import <UIKit/UIKit.h>
#import "ComentModel.h"

@interface MessageCell : UITableViewCell

@property (nonatomic, strong) UILabel *contentLabel;

- (void)configCellWithModel:(ComentModel *)model;

@end

/**如果想做类似微信那样点击评论人名和回复人名跳转的话可以在这里写,我这里总的写成了一个label*/

#import "MessageCell.h"
#import "Masonry.h"
#import "UITableViewCell+HYBMasonryAutoCellHeight.h"

@implementation MessageCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self == [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // contentLabel
        self.contentLabel = [[UILabel alloc] init];
        [self.contentView addSubview:self.contentLabel];
        self.contentLabel.backgroundColor = [UIColor clearColor];
        self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 80;
        self.contentLabel.numberOfLines = 0;
        self.contentLabel.font = [UIFont systemFontOfSize:14.0];
        [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.right.mas_equalTo(self.contentView);
            make.top.mas_equalTo(self.contentView).offset(3.0);
        }];
        self.hyb_lastViewInCell = self.contentLabel;
        self.hyb_bottomOffsetToCell = 3.0;
    }
    return self;
}

- (void)configCellWithModel:(ComentModel *)model {
    NSString *str = nil;
    if (![model.remarkPeople isEqualToString:@""]) {
        str = [NSString stringWithFormat:@"%@ 回复 %@: %@",model.remarkPeople,model.startPeople,model.remarkText];
        NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:str];
        [text addAttribute:NSForegroundColorAttributeName
                     value:[UIColor orangeColor]
                     range:NSMakeRange(0, model.remarkPeople.length)];
        [text addAttribute:NSForegroundColorAttributeName
                     value:[UIColor orangeColor]
                     range:NSMakeRange(model.remarkPeople.length + 4, model.startPeople.length+1)];
        self.contentLabel.attributedText = text;
    }else {
        str = [NSString stringWithFormat:@"%@: %@",model.startPeople,model.remarkText];
        NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:str];
        [text addAttribute:NSForegroundColorAttributeName
                     value:[UIColor orangeColor]
                     range:NSMakeRange(0, model.startPeople.length+1)];
        self.contentLabel.attributedText = text;
    }
}

大致效果是这样的

xxxx.gif

代码写的比较仓促,有什么写的不对的大家可以评论,哈哈
有没有大神愿意加我个小群,自己建的,只有3个人,都比较菜,如果哪位大神平时喜欢带新人的话加我



作者:_Comma
链接:https://www.jianshu.com/p/0061df465650
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值