仿微信评论回复(简易)
_Comma 关注
2016.12.16 19:24* 字数 283 阅读 976评论 17喜欢 5
简单的微信评论回复功能
先说说大概逻辑,一个控制器里添加列表(类似朋友圈的每条动态),每个动态里面再添加一个列表(用来显示所有评论以及点击回复评论),都是用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@interfaceViewController()@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@implementationViewController-(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 { [superviewDidLoad];self.view.backgroundColor = [UIColorwhiteColor];self.tableview = [[UITableViewalloc]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 *)touches withEvent:(UIEvent*)event { [self.chatKeyBoard keyboardUpforComment];}#pragma mark --#pragma mark -- UITableViewDelegate- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {returnself.allMessage.count;}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];if(!cell) { cell = [[TableViewCell alloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"cell"]; cell.delegate =self; } [cell configCellWithModel:self.allMessage[indexPath.row] indexPath:indexPath];returncell;}- (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 = [NSStringstringWithFormat:@"回复%@:",model.remarkPeople]; }else{self.chatKeyBoard.placeHolder = [NSStringstringWithFormat:@"回复%@:",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 = [NSMutableArrayarrayWithArray:model.allComents]; [mtAry addObject:commodel]; model.allComents = mtAry.mutableCopy; [self.tableview reloadRowsAtIndexPaths:@[self.myIndexPath] withRowAnimation:UITableViewRowAnimationFade];}
下面是第一个tableViewCell的.h和.m
#import#import"ComentModel.h"#import"AllComentModel.h"@classTableViewCell;@protocolTableviewCellDelegate- (void)clickCellWithModel:(ComentModel *)model andIndex:(NSIndexPath*)indexPath;@end@interfaceTableViewCell:UITableViewCell@property(nonatomic,weak)id 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@interfaceTableViewCell()@property(nonatomic,strong)NSIndexPath*indexPath;@property(nonatomic,strong) AllComentModel *allComents;@end@implementationTableViewCell- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier {if(self= [superinitWithStyle:style reuseIdentifier:reuseIdentifier]) {self.backgroundColor = [UIColorlightGrayColor];self.tableView = [[UITableViewalloc] 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; }returnself;}- (void)configCellWithModel:(AllComentModel *)model indexPath:(NSIndexPath*)indexPath {CGFloattableviewHeight =0;self.allComents = model;self.indexPath = indexPath;for(ComentModel *comentModelinmodel.allComents) {CGFloatcellheight = [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 {returnself.allComents.allComents.count;}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];if(!cell) { cell = [[MessageCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"Cell"]; } ComentModel *model =self.allComents.allComents[indexPath.row]; [cell configCellWithModel:model];returncell;}- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { ComentModel *model =self.allComents.allComents[indexPath.row];CGFloatcell_height = [MessageCell hyb_heightForTableView:tableView config:^(UITableViewCell*sourceCell) { MessageCell *cell = (MessageCell *)sourceCell; [cell configCellWithModel:model]; } cache:^NSDictionary*{NSDictionary*cache = @{kHYBCacheUniqueKey :@"", kHYBCacheStateKey :@"", kHYBRecalculateForStateKey : @(YES)};returncache; }];returncell_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#import"ComentModel.h"@interfaceMessageCell:UITableViewCell@property(nonatomic,strong)UILabel*contentLabel;- (void)configCellWithModel:(ComentModel *)model;@end
/**如果想做类似微信那样点击评论人名和回复人名跳转的话可以在这里写,我这里总的写成了一个label*/#import"MessageCell.h"#import"Masonry.h"#import"UITableViewCell+HYBMasonryAutoCellHeight.h"@implementationMessageCell- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier {if(self== [superinitWithStyle:style reuseIdentifier:reuseIdentifier]) {// contentLabelself.contentLabel = [[UILabelalloc] init]; [self.contentView addSubview:self.contentLabel];self.contentLabel.backgroundColor = [UIColorclearColor];self.contentLabel.preferredMaxLayoutWidth = [UIScreenmainScreen].bounds.size.width -80;self.contentLabel.numberOfLines =0;self.contentLabel.font = [UIFontsystemFontOfSize: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; }returnself;}- (void)configCellWithModel:(ComentModel *)model {NSString*str =nil;if(![model.remarkPeople isEqualToString:@""]) { str = [NSStringstringWithFormat:@"%@ 回复 %@: %@",model.remarkPeople,model.startPeople,model.remarkText];NSMutableAttributedString*text = [[NSMutableAttributedStringalloc] initWithString:str]; [text addAttribute:NSForegroundColorAttributeNamevalue:[UIColororangeColor] range:NSMakeRange(0, model.remarkPeople.length)]; [text addAttribute:NSForegroundColorAttributeNamevalue:[UIColororangeColor] range:NSMakeRange(model.remarkPeople.length +4, model.startPeople.length+1)];self.contentLabel.attributedText = text; }else{ str = [NSStringstringWithFormat:@"%@: %@",model.startPeople,model.remarkText];NSMutableAttributedString*text = [[NSMutableAttributedStringalloc] initWithString:str]; [text addAttribute:NSForegroundColorAttributeNamevalue:[UIColororangeColor] range:NSMakeRange(0, model.startPeople.length+1)];self.contentLabel.attributedText = text; }}
大致效果是这样的
xxxx.gif
代码写的比较仓促,有什么写的不对的大家可以评论,哈哈
有没有大神愿意加我个小群,自己建的,只有3个人,都比较菜,如果哪位大神平时喜欢带新人的话加我群:515385179 哈哈