美文网首页iOS开发随笔iOS Developer
仿微信评论回复(简易)

仿微信评论回复(简易)

作者: _Comma | 来源:发表于2016-12-16 19:24 被阅读1399次

    简单的微信评论回复功能

    先说说大概逻辑,一个控制器里添加列表(类似朋友圈的每条动态),每个动态里面再添加一个列表(用来显示所有评论以及点击回复评论),都是用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个人,都比较菜,如果哪位大神平时喜欢带新人的话加我群:515385179 哈哈

    另外加个广告,推荐几个自己GitHub项目,希望多几个星星

    UILabel分类,使用简单,动画改变label数值
    对极光推送和信鸽推送的封装,统一调用,简单易懂
    对MJRefresh二次封装,让代码更清晰
    封装的一个二维码扫描器
    登陆、支付、分享(待完善)功能封装
    这是我的GitHub首页

    相关文章

      网友评论

      • c2fffd2b0090:这个 适配 iOS 11 了吗???好像在iOS 11 键盘的输入宽就不见了
      • 0da090ef6abe:有demo吗?
      • 今晚写bug:iOS 11 第二次输入会出现 tabbar被顶起来的问题,急求解决方案。谢谢
      • 鬼丶白:你好 ChatKeyBoard 键盘在iOS 11 里面第二次输入框不显示
        鬼丶白:@青青是老大要听青青话 你也遇到了、】?
        Alger_梁:您好 您解决第二次不显示的问题了吗
        _Comma:@soime 这个你看看适配一下?我现在没有用那个了
      • 64e19b4baa1c:你好 有demo吗?
        _Comma:@累不死就往死里累 有的,我放那个qq群里了,可以申请了自取

      本文标题:仿微信评论回复(简易)

      本文链接:https://www.haomeiwen.com/subject/uoznmttx.html