iOS - 评论功能实现

作者: Mn_Su | 来源:发表于2017-10-30 10:25 被阅读124次
    473EC3D1187D837EFC648B3A0FED6903.png

    前言:偷个懒,这篇文章写起来有些绕,还要修改做好的数据之类的,所以大概只写个思路,代码不用看的太过相信!

    零、核心代码和思路

        1. 在控制器创建 commentView,然后赋值Model,在commentView.m中 setModel重新初始化,并赋值使用;
    
        2.评论功能分为 评论tableview 和 回复tableview;    
    
        3.在重新初始化 setModel set方法中,获取评论条数和model,根据评论内容计算出文本高度,然后重设评论tableview高度;
    
        4.在评论tableview 的 cellForRowAtIndexPath 方法里,获取回复内容的条数和model,然后根据回复内容计算出文本高度,然后用 cell的方法赋值到回复tableview中,刷新列表,代码:
    
            1)MSUVideoDetailCommentView中代码
                // 计算回复table 高度
                CGFloat tableViewHeight = 0.0;
                if (arrModel.reply.count > 0) {
                    for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                            str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                        }else {
                            str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                        }
                        CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                        tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                    }
                } else{
                    tableViewHeight = -15;
                }
                
                // 加上头部视图和底部试图
                [cell configCellWithModel:arrModel tableHeight:tableViewHeight+15];
            
                cell.lineView.frame = CGRectMake(55, CGRectGetMaxY(cell.commentLab.frame)+5+tableViewHeight+15+10-1, SelfWidth-55-14, 1);
    
            2) MSUVideoCommentTableCell 中代码
    
                - (void)configCellWithModel:(MSUArrModel *)model tableHeight:(NSInteger)height{
                    self.arrModel = model;
                
                    // 重设 回复table高度
                    [_commentTableView remakeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(_commentLab.bottom).offset(5);
                        make.left.equalTo(_commentLab.left).offset(0);
                        make.width.equalTo(CommentTableWidth);
                        make.height.equalTo(height);
                    }];
                    
                    [self.commentTableView reloadData];
                }
        
            5. 回复tableview 中 回复内容颜色是富文本设置,代码:
    
                        if (commentModel.to_user.length > 0) {
                            // 富文本设置
                            NSString *str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                            NSMutableAttributedString *att = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.to_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                            cell.commentLab.attributedText = [MSUStringTools makeAttrubuteKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:att font:10 color:HEXCOLOR(0xf49418)];
                        }else {
                            // 富文本设置
                            NSString *str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                            cell.commentLab.attributedText = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                        }
    
                6.评论view的整体高度回调,在评论tableview 中的 setModel方法中,遍历 评论条数和model 以及 回复条数和model,计算出内容高度, 然后回调给控制器 中的scrollview 的contentSize,代码:
    
                    MSUVideoDetailCommentView中:
                    
                    - (void)setDataModel:(MSUDataDetailModel *)dataModel{
                        _dataModel = dataModel;
                        
                        if (_dataModel.comments.count > 0) {
                            self.titLab.text = [NSString stringWithFormat:@"评论(%ld)",_dataModel.comments.count];
                            self.comeLab.hidden = YES;
                            self.tableView.hidden = NO;
                        } else{
                            self.titLab.text = @"评论";
                            self.tableView.hidden = YES;
                            self.comeLab.hidden = NO;
                        }
                        
                        CGFloat height = 0.0;
                        for (NSInteger i = 0; i < _dataModel.comments.count; i++) {
                            MSUArrModel *arrModel = _dataModel.comments[i];
                            // 计算评论内容高度
                            CGRect rect = [MSUStringTools danamicGetHeightFromText:arrModel.content WithWidth:SelfWidth-65-14 font:11];
                            
                            // 计算回复table高度
                            CGFloat tableViewHeight = 0.0;
                            for (NSInteger i = 0; i < arrModel.reply.count; i++) {
                                MSUCommentModel *commentModel = arrModel.reply[i];
                                NSString *str;
                                if (commentModel.to_user.length > 0) {
                                    str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                                }else {
                                    str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                                }
                                CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                                tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                            }
                            
                            // 计算评论table高度
                           height = height + 28 + rect.size.height + 5 + tableViewHeight + 15 + 10;
                        }
                        
                        // 重设评论table高度
                        [_tableView remakeConstraints:^(MASConstraintMaker *make) {
                            make.top.equalTo(self.top).offset(35);
                            make.left.equalTo(self.left).offset(0);
                            make.width.equalTo(SelfWidth);
                            make.height.equalTo(height);
                        }];
                        
                        [self.tableView reloadData];
                        
                        if (self.tableHeightBlock) {
                            self.tableHeightBlock(height);
                        }
                    }
    
                控制器中 : 
        
                    __weak typeof(self) weakSelf = self;
                    _comment.tableHeightBlock = ^(NSInteger height) {
                        // 更改滚动视图的滚动面积
                        weakSelf.bgScrollView.contentSize = CGSizeMake(0, 10+self.videoHeight+5+130+height+45);
                        // 更改评论父视图的frame
                        CGRect frame = weakSelf.comment.frame;
                        frame.size.height = 10+self.videoHeight+5+130+height;
                        weakSelf.comment.frame = frame;
                    };
    

    一、模型 MSUVideoDetailModel (因为做的是视频、商品,然后下面有评论,所以model内容较多,MSUArrModel和MSUCommentModel是评论的数据结构,其他的可以忽视)

        1.MSUVideoDetailModel.h中的代码
    
            #import <Foundation>
    
            @class MSUDataDetailModel;
            @class MSUDetailVideoModel;
            @class MSUDetailGoodsModel;
            @class MSUCommentModel;
            @class MSUArrModel;
            @class MSUSignDetailModel;
            
            
            @interface MSUVideoDetailModel : NSObject
            
            /// 成功码
            @property (nonatomic , assign) NSInteger code;
            
            /// data
            @property (nonatomic , strong) NSArray<MSUDataDetailModel> *data;
            
            /// msg
            @property (nonatomic , copy) NSString *msg;
            
            @end
            
            
            @interface MSUDataDetailModel : NSObject
            
            /// 商品
            @property (nonatomic , strong) NSArray<MSUDetailGoodsModel> *goods;
            /// 动态视频
            @property (nonatomic , strong) NSArray<MSUDetailVideoModel> *video;
            /// 评论
            @property (nonatomic , strong) NSArray<MSUArrModel> *comments;
            /// 自己id
            @property (nonatomic , assign)NSInteger my_id;
            
            
            
            @end
            
            #pragma makr - 视频
            @interface MSUDetailVideoModel : NSObject
            
            /// 作者id
            @property (nonatomic , assign) NSInteger _id;
            
            /// 作者头像
            @property (nonatomic , copy) NSString *author_avatar;
            
            /// 作者名字
            @property (nonatomic , copy) NSString *author_nickname;
            
            /// 评论数量
            @property (nonatomic , assign) NSInteger comment_num;
            
            /// 转发人头像
            @property (nonatomic , copy) NSString *d_avatar;
            
            /// 转发人名字
            @property (nonatomic , copy) NSString *d_nickname;
            
            /// 转发人id
            @property (nonatomic , assign) NSInteger d_userid;
            
            /// 转发人的评论
            @property (nonatomic , copy) NSString *describe;
            
            /// 动态的id
            @property (nonatomic , assign) NSInteger dynamic_state_id;
            
            /// 转发数量
            @property (nonatomic , assign) NSInteger forward_num;
            
            /// 是否关注
            @property (nonatomic , assign) NSInteger is_followed;
            
            /// 是否收藏
            @property (nonatomic , assign) NSInteger is_collected;
            
            /// 是否转发
            @property (nonatomic , assign) NSInteger is_relay;
            
            /// 是否举报
            @property (nonatomic , assign) NSInteger is_tipped;
            
            /// 经度
            @property (nonatomic , copy) NSString *latitude;
            
            /// 维度
            @property (nonatomic , copy) NSString *longitude;
            
            /// 地名
            @property (nonatomic , copy) NSString *place_name;
            
            /// 点赞数量
            @property (nonatomic , assign) NSInteger upvote;
            
            /// 是否点赞
            @property (nonatomic , assign) NSInteger is_liked;
            
            /// 评论内容
            @property (nonatomic , copy) NSString *video_brife;
            
            /// 视频id
            @property (nonatomic , assign) NSInteger video_id;
            
            /// 发布时间
            @property (nonatomic , copy) NSString *video_upload_time;
            
            /// 视频封面图
            @property (nonatomic , copy) NSString *video_img;
            
            /// 视频点赞人数
            @property (nonatomic , assign) NSInteger video_like;
            
            /// 视频url
            @property (nonatomic , copy) NSString *video_source_url;
            
            /// 标签时间
            @property (nonatomic , strong) NSArray<MSUSignDetailModel> *sign;
            
            @end
            
            @interface MSUSignDetailModel : NSObject
            
            @property (nonatomic , copy) NSString *name;
            
            @property (nonatomic , copy) NSString *time;
            
            @end
            
            
            #pragma mark  - 商品
            @interface MSUDetailGoodsModel : NSObject
            
            /// 商品id
            @property (nonatomic , copy) NSString *goods_id;
            
            /// 商品名字
            @property (nonatomic , copy) NSString *goods_name;
            
            /// 商品图片
            @property (nonatomic , copy) NSString *goods_pic;
            
            /// 商品价格
            @property (nonatomic , assign) NSString *goods_price;
            
            /// id
            @property (nonatomic , copy) NSString *_id;
            
            /// 卖家头像
            @property (nonatomic , copy) NSString *avatar;
            
            /// 结束时间
            @property (nonatomic , copy) NSString *goods_expire_time;
            
            /// 开始时间
            @property (nonatomic , copy) NSString *goods_start_time;
            
            /// 卖家名字
            @property (nonatomic , copy) NSString *nickname;
            
            /// 推广佣金
            @property (nonatomic , copy) NSString *spread_money;
            
            /// 购买商品结算佣金
            @property (nonatomic , copy) NSString *video_brokerage;
            
            /// 是否是推广商品
            @property (nonatomic , assign) NSInteger is_popularize;
            
            @end
            
            
            #pragma makr - 评论
            @interface MSUArrModel : NSObject
            
            /// 评论id
            @property (nonatomic , copy) NSString *_id;
            
            /// 评论内容
            @property (nonatomic , copy) NSString *content;
            
            /// 评论者的头像
            @property (nonatomic , copy) NSString *from_avatar;
            
            /// 评论者的id
            @property (nonatomic , copy) NSString *from_uid;
            
            /// 评论者的昵称
            @property (nonatomic , copy) NSString *from_user;
            
            /// 时间戳
            @property (nonatomic , copy) NSString *time;
            
            /// 点赞数
            @property (nonatomic , copy) NSString *upvote;
            
            /// 是否点赞
            @property (nonatomic , assign) NSInteger is_liked;
            
            /// 是否恢复  1为评论 2为回复
            @property (nonatomic , copy) NSString *topic_type;
            
            /// 回复
            @property (nonatomic , strong) NSArray<MSUCommentModel> *reply;
            
            @end
            
            
            @interface MSUCommentModel : NSObject
            
            /// 评论id
            @property (nonatomic , copy) NSString *_id;
            
            /// 内容
            @property (nonatomic , copy) NSString *content;
            
            /// 评论者的头像
            @property (nonatomic , copy) NSString *from_avatar;
            
            /// 评论者的id
            @property (nonatomic , copy) NSString *from_uid;
            
            /// 评论者的昵称
            @property (nonatomic , copy) NSString *from_user;
            
            /// 时间戳
            @property (nonatomic , copy) NSString *time;
            
            /// 被评论者的头像
            @property (nonatomic , copy) NSString *to_avatar;
            
            /// 被评论的评论id
            @property (nonatomic , copy) NSString *to_comment_id;
            
            /// 被评论的评论者id
            @property (nonatomic , copy) NSString *to_uid;
            
            /// 被评论的评论者昵称
            @property (nonatomic , copy) NSString *to_user;
            
            /// 被评论时,首条评论的id
            @property (nonatomic , copy) NSString *topic_id;
            
            /// 是否恢复  1为评论 2为回复
            @property (nonatomic , copy) NSString *topic_type;
            
            /// 点赞数量
            @property (nonatomic , copy) NSString *upvote;
            
            ///
            
            @end
    
        2.MSUVideoDetailModel.m中的代码
    
            #import "MSUVideoDetailModel.h"
    
            @implementation MSUVideoDetailModel
            
            + (NSDictionary *)mj_objectClassInArray{
                return @{@"data":[MSUDataDetailModel class]};
            }
            
            @end
            
            @implementation MSUDataDetailModel
            
            + (NSDictionary *)mj_objectClassInArray{
                return @{@"video":[MSUDetailVideoModel class],
                         @"goods":[MSUDetailGoodsModel class],
                         @"comments":[MSUArrModel class]};
            }
            
            @end
            
            
            #pragma makr - 视频
            @implementation MSUDetailVideoModel
            
            + (NSDictionary *)mj_objectClassInArray{
                return @{@"sign":[MSUSignDetailModel class]};
            }
            
            @end
            
            @implementation MSUSignDetailModel
            
            
            @end
            
            
            #pragma makr - 商品
            @implementation MSUDetailGoodsModel
            
            
            @end
            
            
            #pragma makr - 评论
            @implementation MSUCommentModel
            
            @end
            
            @implementation MSUArrModel
            
            + (NSDictionary *)mj_objectClassInArray{
                return @{@"reply":[MSUCommentModel class]};
            }
            
            @end
    

    二、评论的核心结构就是 tableview 嵌套 tableview ,所以,新建一个View 集成UIView MSUVideoDetailCommentView

    1. MSUVideoDetailCommentView.h 中的代码
    
            #import <UIKit>
            #import "MSUVideoDetailModel.h"
            
            @protocol MSUVideoDetailCommentViewDelegate <NSObject>
            
            - (void)pinglunCellDidSelectWithUid:(NSString *)uid commentID:(NSString *)commentID topId:(NSString *)topID;
            
            @end
            
            @interface MSUVideoDetailCommentView : UIView
            
            @property (nonatomic , weak) id<MSUVideoDetailCommentViewDelegate> delegate;
            
            /// 回调table高度
            @property (nonatomic , copy)void(^tableHeightBlock)(NSInteger height);
            
            /// 评论标题
            @property (nonatomic , strong) UILabel *titLab;
            
            /// 内容
            @property (nonatomic , strong) UITableView *tableView;
            
            /// 无内容视图
            @property (nonatomic , strong) UILabel * comeLab;
            
            /// 数据
            @property (nonatomic , strong) MSUDataDetailModel *dataModel;
            
            /// 行高
            @property (nonatomic , assign) CGFloat cellHeight;
            
            
            @end
    
        2. MSUVideoDetailCommentView.m 中的代码 (MSUPathTools.h 是我封装的路径类,MSUStringTools.h是封装的string相关类,在这个地方用以获取文本高度,MSUAFNRequest.h是网络请求类,MSUHUD.h是弹窗类,可根据自己封装类使用)
    
                #import "MSUVideoDetailCommentView.h"
    
                #import "UIButton+WebCache.h"
                #import "MSUPathTools.h"
                #import "MSUStringTools.h"
                #import "MSUAFNRequest.h"
                #import "MSUHUD.h"
                
                #define WIDTH [UIScreen mainScreen].bounds.size.width
                
                #define SelfWidth [UIScreen mainScreen].bounds.size.width
                
                //masonry
                #define MAS_SHORTHAND
                #define MAS_SHORTHAND_GLOBALS
                #import "Masonry.h"
                
                #define HEXCOLOR(rgbValue)      [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
                
                #import "MSUVideoCommentTableCell.h"
                
                @interface MSUVideoDetailCommentView ()<UITableViewDelegate>
                
                @end
                
                @implementation MSUVideoDetailCommentView
                
                - (instancetype)initWithFrame:(CGRect)frame
                {
                    if (self = [super initWithFrame:frame]) {
                        
                        [self createView];
                        
                    }
                    return self;
                }
                
                - (void)setDataModel:(MSUDataDetailModel *)dataModel{
                    _dataModel = dataModel;
                    
                    if (_dataModel.comments.count > 0) {
                        self.titLab.text = [NSString stringWithFormat:@"评论(%ld)",_dataModel.comments.count];
                        self.comeLab.hidden = YES;
                        self.tableView.hidden = NO;
                    } else{
                        self.titLab.text = @"评论";
                        self.tableView.hidden = YES;
                        self.comeLab.hidden = NO;
                    }
                    
                    CGFloat height = 0.0;
                    for (NSInteger i = 0; i < _dataModel.comments.count; i++) {
                        MSUArrModel *arrModel = _dataModel.comments[i];
                        // 计算评论内容高度
                        CGRect rect = [MSUStringTools danamicGetHeightFromText:arrModel.content WithWidth:SelfWidth-65-14 font:11];
                        
                        // 计算回复table高度
                        CGFloat tableViewHeight = 0.0;
                        for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                                str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                            }else {
                                str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                            }
                            CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                            tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                        }
                        
                        // 计算评论table高度
                       height = height + 28 + rect.size.height + 5 + tableViewHeight + 15 + 10;
                    }
                    
                    // 重设评论table高度
                    [_tableView remakeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(self.top).offset(35);
                        make.left.equalTo(self.left).offset(0);
                        make.width.equalTo(SelfWidth);
                        make.height.equalTo(height);
                    }];
                    
                    [self.tableView reloadData];
                    
                    if (self.tableHeightBlock) {
                        self.tableHeightBlock(height);
                    }
                }
                
                
                - (void)createView{
                    UIView *navView = [[UIView alloc] init];
                    navView.backgroundColor = [UIColor whiteColor];
                    [self addSubview:navView];
                    [navView makeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(self.top).offset(0);
                        make.left.equalTo(self.left).offset(0);
                        make.width.equalTo(SelfWidth);
                        make.height.equalTo(50);
                    }];
                    
                    // 标题 评论
                    self.titLab = [[UILabel alloc] init];
                //    _titLab.backgroundColor = [UIColor redColor];
                    _titLab.font = [UIFont systemFontOfSize:14];
                    _titLab.textColor = HEXCOLOR(0x333333);
                    [navView addSubview:_titLab];
                    [_titLab makeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(self.top).offset(15);
                        make.left.equalTo(self.left).offset(14);
                        make.width.equalTo(SelfWidth*0.5);
                        make.height.equalTo(20);
                    }];
                    
                    
                    // tableview
                    self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
                    _tableView.backgroundColor = [UIColor whiteColor];
                    _tableView.showsVerticalScrollIndicator = NO;
                    _tableView.showsHorizontalScrollIndicator = NO;
                    _tableView.scrollEnabled = NO;
                //    _tableView.userInteractionEnabled = NO;
                    [self addSubview:_tableView];
                    [_tableView registerClass:[MSUVideoCommentTableCell class] forCellReuseIdentifier:@"commentVideoShopCell"];
                    self.tableView.delegate = self;
                    self.tableView.dataSource = self;
                    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
                    
                    self.comeLab = [[UILabel alloc] init];
                    _comeLab.backgroundColor = [UIColor clearColor];
                    _comeLab.text = @"快来发表你的评论吧~";
                    _comeLab.textAlignment = NSTextAlignmentCenter;
                    _comeLab.font = [UIFont systemFontOfSize:11];
                    _comeLab.textColor = HEXCOLOR(0xf49418);
                    [self addSubview:_comeLab];
                    [_comeLab makeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(navView.bottom).offset(10);
                        make.left.equalTo(self.left).offset(0);
                        make.width.equalTo(SelfWidth);
                        make.height.equalTo(20);
                    }];
                    _comeLab.hidden = YES;
                }
                
                - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
                    return _dataModel.comments.count;
                }
                
                - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
                    // 避免出现cellForRowAtIndexPath中的indexPath.row从4或5开始走,默认设置个初始值
                    if (self.cellHeight) {
                        return self.cellHeight;
                    } else{
                        return 2;
                    }
                }
                
                - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
                    MSUVideoCommentTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"commentVideoShopCell"];
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
                    
                    MSUArrModel *arrModel = _dataModel.comments[indexPath.row];
                    
                    [cell.iconBtn sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://source.showbuy100.com%@",arrModel.from_avatar]] forState:UIControlStateNormal placeholderImage:[MSUPathTools showImageWithContentOfFileByName:@"search-headbig"]];
                    cell.nickLab.text = arrModel.from_user;
                    cell.commentLab.text = arrModel.content;
                    CGRect rect = [MSUStringTools danamicGetHeightFromText:arrModel.content WithWidth:SelfWidth-65-14 font:11];
                    cell.commentLab.frame = CGRectMake(55, 28, SelfWidth-55-14, rect.size.height);
                    
                    // 评论
                    cell.pingBtnClickBlock = ^(UIButton *btn) {
                        if (self.delegate && [self.delegate respondsToSelector:@selector(pinglunCellDidSelectWithUid:commentID:topId:)]) {
                            [self.delegate pinglunCellDidSelectWithUid:arrModel.from_uid commentID:arrModel._id topId:arrModel._id];
                        }
                    };
                    
                    // 点赞
                    if (arrModel.upvote.length > 0 && [arrModel.upvote integerValue] > 0) {
                        cell.likeLab.hidden = NO;
                        cell.likeLab.text = arrModel.upvote;
                        CGSize sizea = [MSUStringTools danamicGetWidthFromText:cell.likeLab.text WithFont:11];
                        cell.likeLab.frame = CGRectMake(SelfWidth-14-15-25, 10, sizea.width, 15);
                        
                        cell.likeBtn.frame = CGRectMake(SelfWidth-14-15-25-sizea.width-15, 10, 15, 15);
                    } else{
                        cell.likeLab.hidden = YES;
                        cell.likeBtn.frame = CGRectMake(SelfWidth-14-15-30, 10, 15, 15);
                    }
                    
                    if (arrModel.is_liked) {
                        [cell.likeBtn setTitle:arrModel.upvote forState:UIControlStateNormal];
                        cell.likeBtn.selected = YES;
                    }else{
                        cell.likeBtn.selected = NO;
                        __weak typeof(cell) weakCell = cell;
                        cell.likeBtnClickBlock = ^(UIButton *btn) {
                            btn.selected = YES;
                            weakCell.likeLab.hidden = NO;
                            weakCell.likeLab.text = [NSString stringWithFormat:@"%ld",[arrModel.upvote integerValue]+1];
                            CGSize sizea = [MSUStringTools danamicGetWidthFromText:weakCell.likeLab.text WithFont:11];
                            weakCell.likeLab.frame = CGRectMake(SelfWidth-14-15-25, 10, sizea.width, 15);
                            weakCell.likeBtn.frame = CGRectMake(SelfWidth-14-15-25-sizea.width-15, 10, 15, 15);
                            
                            NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"];
                            token = token?token:@"";
                            NSDictionary *dic = @{@"token":token,@"_id":arrModel._id};
                            [[MSUAFNRequest sharedInstance] postRequestWithURL:@"http://api.showbuy100.com/index/comment-up" parameters:dic withBlock:^(id obj, NSError *error) {
                                if (obj) {
                                    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:obj options:NSJSONReadingMutableLeaves error:nil];
                                    if (!error) {
                                        NSLog(@"访问成功%@",jsonDict);
                                        btn.userInteractionEnabled = NO;
                                    }else{
                                        NSLog(@"访问报错%@",error);
                                    }
                                } else{
                                    [MSUHUD showFileWithString:@"服务器请求为空"];
                                }
                               
                            }];
                
                           
                        };
                    }
                    
                    // 计算回复table 高度
                    CGFloat tableViewHeight = 0.0;
                    if (arrModel.reply.count > 0) {
                        for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                                str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                            }else {
                                str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                            }
                            CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                            tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                        }
                    } else{
                        tableViewHeight = -15;
                    }
                    
                    // 加上头部视图和底部试图
                    [cell configCellWithModel:arrModel tableHeight:tableViewHeight+15];
                
                    cell.lineView.frame = CGRectMake(55, CGRectGetMaxY(cell.commentLab.frame)+5+tableViewHeight+15+10-1, SelfWidth-55-14, 1);
                
                    
                    self.cellHeight = CGRectGetMaxY(cell.lineView.frame);
                    cell.delegate = self;
                    
                    return cell;
                }
                
                - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
                    MSUArrModel *arrModel = _dataModel.comments[indexPath.row];
                
                    NSLog(@"评论cell");
                    if (self.delegate && [self.delegate respondsToSelector:@selector(pinglunCellDidSelectWithUid:commentID:topId:)]) {
                        [self.delegate pinglunCellDidSelectWithUid:arrModel.from_uid commentID:arrModel._id topId:arrModel._id];
                    }
                }
                
                - (void)replyCellDidSelectWithUid:(NSString *)uid commentID:(NSString *)commentID topId:(NSString *)topID{
                    if (self.delegate && [self.delegate respondsToSelector:@selector(pinglunCellDidSelectWithUid:commentID:topId:)]) {
                        [self.delegate pinglunCellDidSelectWithUid:uid commentID:commentID topId:topID];
                    }
                }
                
                @end
    

    三、MSUVideoCommentTableCell 内容,回复tableview创建就是在 这个cell里面

        1. MSUVideoCommentTableCell.h 中的代码
    
                    
            #import <UIKit>
            #import "MSUVideoDetailModel.h"
            
            @protocol MSUVideoCommentTableCellDelegate <NSObject>
            
            - (void)replyCellDidSelectWithUid:(NSString *)uid commentID:(NSString *)commentID topId:(NSString *)topID;
            
            @end
            
            @interface MSUVideoCommentTableCell : UITableViewCell
            
            @property (nonatomic , weak) id<MSUVideoCommentTableCellDelegate> delegate;
            
            /// 点赞按钮回调
            @property (nonatomic , copy) void(^likeBtnClickBlock)(UIButton *btn);
            /// 评论按钮回调
            @property (nonatomic , copy) void(^pingBtnClickBlock)(UIButton *btn);
            
            /// 头像
            @property (nonatomic , strong) UIButton *iconBtn;
            
            /// 昵称
            @property (nonatomic , strong) UILabel *nickLab;
            
            /// 评论
            @property (nonatomic , strong) UIButton *commentBtn;
            
            /// 点赞
            @property (nonatomic , strong) UIButton *likeBtn;
            @property (nonatomic , strong) UILabel *likeLab;
            
            /// 内容
            @property (nonatomic , strong) UILabel *commentLab;
            
            /// 背景线
            @property (nonatomic , strong) UIView *lineView;
            
            /// 评论列表
            @property (nonatomic , strong) UITableView *commentTableView;
            
            /// 数据
            @property (nonatomic , strong) MSUArrModel *arrModel;
            
            /// 行高
            @property (nonatomic , assign) CGFloat cellHeight;
            
            - (void)configCellWithModel:(MSUArrModel *)model tableHeight:(NSInteger )height;
            
            
            @end
    
        2. MSUVideoCommentTableCell.m 中的代码
    
            #import "MSUVideoCommentTableCell.h"
            #import "MSUCommentTextTableCell.h"
            
            #import "MSUStringTools.h"
            
            //masonry
            #define MAS_SHORTHAND
            #define MAS_SHORTHAND_GLOBALS
            #import "Masonry.h"
            
            #define SelfWidth [UIScreen mainScreen].bounds.size.width
            #define CommentTableWidth SelfWidth-28-36-5
            
            #define HEXCOLOR(rgbValue)      [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
            
            @interface MSUVideoCommentTableCell()<UITableViewDataSource>
            
            @end
            
            @implementation MSUVideoCommentTableCell
            
            - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
                if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
                    [self createView];
                }
                return self;
            }
            
            - (void)createView{
                // 头像
                self.iconBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                _iconBtn.backgroundColor = HEXCOLOR(0xfe4e17);
                _iconBtn.layer.cornerRadius = 18;
                _iconBtn.clipsToBounds = YES;
                _iconBtn.layer.shouldRasterize = YES;
                _iconBtn.layer.rasterizationScale = [UIScreen mainScreen].scale;
                [self addSubview:_iconBtn];
                [_iconBtn makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(self.top).offset(10);
                    make.left.equalTo(self.left).offset(14);
                    make.width.equalTo(36);
                    make.height.equalTo(36);
                }];
                
                // 昵称
                self.nickLab = [[UILabel alloc] init];
                _nickLab.font = [UIFont systemFontOfSize:13];
                //    _nickLab.backgroundColor = [UIColor brownColor];
                [self addSubview:_nickLab];
                [_nickLab makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(self.top).offset(10);
                    make.left.equalTo(_iconBtn.right).offset(5);
                    make.width.equalTo(SelfWidth * 0.5);
                    make.height.equalTo(10);
                }];
                
                // 评论
                self.commentBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                [_commentBtn setImage:[UIImage imageNamed:@"state-comment"] forState:UIControlStateNormal];
                _commentBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
                [self addSubview:_commentBtn];
                [_commentBtn makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(_nickLab.top).offset(0);
                    make.right.equalTo(self.right).offset(-14);
                    make.width.equalTo(15);
                    make.height.equalTo(15);
                }];
                [_commentBtn addTarget:self action:@selector(commentBtnClick:) forControlEvents:UIControlEventTouchUpInside];
            
                // 点赞
                self.likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                [_likeBtn setImage:[UIImage imageNamed:@"like"] forState:UIControlStateNormal];
                [_likeBtn setImage:[UIImage imageNamed:@"WechatIMG1191"] forState:UIControlStateSelected];
                _likeBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
                [self addSubview:_likeBtn];
            //    [_likeBtn makeConstraints:^(MASConstraintMaker *make) {
            //        make.top.equalTo(_nickLab.top).offset(0);
            //        make.right.equalTo(_commentBtn.left).offset(-20);
            //        make.width.equalTo(12.5);
            //        make.height.equalTo(12.5);
            //    }];
                [_likeBtn addTarget:self action:@selector(likeBtnClick:) forControlEvents:UIControlEventTouchUpInside];
                
                // 正文
                self.likeLab = [[UILabel alloc] init];
                [_likeLab setTextColor:HEXCOLOR(0x333333)];
                _likeLab.textAlignment = NSTextAlignmentRight;
                //    _timeLab.backgroundColor = [UIColor redColor];
                _likeLab.font = [UIFont systemFontOfSize:11];
                [self addSubview:_likeLab];
                _likeLab.hidden = YES;
                
                // 正文
                self.commentLab = [[UILabel alloc] init];
                [_commentLab setTextColor:HEXCOLOR(0x333333)];
                //    _timeLab.backgroundColor = [UIColor redColor];
                _commentLab.font = [UIFont systemFontOfSize:11];
                _commentLab.numberOfLines = 0;
                [self addSubview:_commentLab];
                
                self.commentTableView = [[UITableView alloc] init];
                _commentTableView.backgroundColor = HEXCOLOR(0xf4f4f4);
                _commentTableView.dataSource = self;
                _commentTableView.delegate = self;
                [self addSubview:_commentTableView];
                _commentTableView.scrollEnabled = NO;
            //    _commentTableView.userInteractionEnabled = NO;
                _commentTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
                [_commentTableView registerClass:[MSUCommentTextTableCell class] forCellReuseIdentifier:@"commentText1Cell"];
                
                self.lineView = [[UIView alloc] init];
                _lineView.backgroundColor = HEXCOLOR(0xf4f4f4);
                [self addSubview:_lineView];
                
                UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CommentTableWidth, 7.5)];
                view.backgroundColor = HEXCOLOR(0xf4f4f4);
                _commentTableView.tableHeaderView = view;
                _commentTableView.tableFooterView = view;
                
            }
            
            - (void)configCellWithModel:(MSUArrModel *)model tableHeight:(NSInteger)height{
                self.arrModel = model;
            
                // 重设 回复table高度
                [_commentTableView remakeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(_commentLab.bottom).offset(5);
                    make.left.equalTo(_commentLab.left).offset(0);
                    make.width.equalTo(CommentTableWidth);
                    make.height.equalTo(height);
                }];
                
                [self.commentTableView reloadData];
            }
            
            - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
                return self.arrModel.reply.count;
            }
            
            - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
                return self.cellHeight;
            }
            
            - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
                MSUCommentTextTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"commentText1Cell"];
                cell.backgroundColor = HEXCOLOR(0xf4f4f4);
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
                
                // 回复内容
                MSUCommentModel *commentModel = self.arrModel.reply[indexPath.row];
                if (commentModel.to_user.length > 0) {
                    // 富文本设置
                    NSString *str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                    NSMutableAttributedString *att = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.to_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                    cell.commentLab.attributedText = [MSUStringTools makeAttrubuteKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:att font:10 color:HEXCOLOR(0xf49418)];
                }else {
                    // 富文本设置
                    NSString *str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                    cell.commentLab.attributedText = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                }
                
                // 计算回复内容高
                CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:cell.commentLab.text WithWidth:CommentTableWidth-20 font:10];
                cell.commentLab.frame = CGRectMake(10, 2.5, CommentTableWidth-20, comnmentRect.size.height);
            
                // cell高度
                self.cellHeight = comnmentRect.size.height + 5;
                
                return cell;
            }
            
            - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
                MSUCommentModel *commentModel = self.arrModel.reply[indexPath.row];
            
                NSLog(@"回复cell");
                if (self.delegate && [self.delegate respondsToSelector:@selector(replyCellDidSelectWithUid:commentID:topId:)]) {
                    [self.delegate replyCellDidSelectWithUid:commentModel.from_uid commentID:commentModel._id topId:self.arrModel._id];
                }
            }
            
            #pragma mark - 点击事件
            - (void)likeBtnClick:(UIButton *)sender{
                if (self.likeBtnClickBlock) {
                    self.likeBtnClickBlock(sender);
                }
            }
            
            - (void)commentBtnClick:(UIButton *)sender{
                if (self.pingBtnClickBlock) {
                    self.pingBtnClickBlock(sender);
                }
            }
            
            @end
    

    四、回复tableview 的 cell ,MSUCommentTextTableCell

        1.MSUCommentTextTableCell.h 中的代码
    
            #import <UIKit>
    
            @interface MSUCommentTextTableCell : UITableViewCell
            
            /// 评论内容
            @property (nonatomic , strong) UILabel *commentLab;
            
            @end
    
        2.MSUCommentTextTableCell.m 中的内容
    
            #import "MSUCommentTextTableCell.h"
    
            //masonry
            #define MAS_SHORTHAND
            #define MAS_SHORTHAND_GLOBALS
            #import "Masonry.h"
            
            
            #define HEXCOLOR(rgbValue)      [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
            
            @implementation MSUCommentTextTableCell
            
            - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
                if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
                    [self createContentView];
                }
                return self;
            }
            
            - (void)createContentView{
                UIView *bgView = [[UIView alloc] init];
                [self addSubview:bgView];
                [bgView makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(self.top).offset(0);
                    make.left.equalTo(self.left).offset(0);
                    make.width.equalTo(self.frame.size.width);
                    make.height.equalTo(2.5);
                }];
                
                self.commentLab = [[UILabel alloc] init];
                _commentLab.font = [UIFont systemFontOfSize:10];
                _commentLab.textColor = HEXCOLOR(0x333333);
                [self addSubview:_commentLab];
                
                UIView *bg1View = [[UIView alloc] init];
                [self addSubview:bg1View];
                [bg1View makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(_commentLab.bottom).offset(0);
                    make.left.equalTo(self.left).offset(0);
                    make.width.equalTo(self.frame.size.width);
                    make.height.equalTo(2.5);
                }];
                
            }
            
            @end
    

    相关文章

      网友评论

        本文标题:iOS - 评论功能实现

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