当前位置:   article > 正文

IOS详解TableView——对话聊天布局的实现

ios 聊天页面需不需要翻转tableview 180°


上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局。这篇讲述如何利用自定义单元格来实现聊天界面的布局。


借助单元格实现聊天布局难度不大,主要要解决的问题有两个:


1.自己和其他人说话头像和气泡图像在不同的位置。

找了些类似的例子,有根据不同情况设置不同的自定义类的。这里使用根据说话人的属性来设置不同的位置,在一个单一的单元格类中。

2.像微博等根据说话的内容长短对说话图片进行拉伸,以及单元格自适应高度。


实现步骤:


搭建界面



数据属性字典




读取数据


  1. - (void)loadData
  2. {
  3. const NSString *RMsgKey = @"msg";
  4. const NSString *RMineKey = @"ismine";
  5. NSString *path = [[NSBundle mainBundle] pathForResource:@"messages" ofType:@"plist"];
  6. NSArray *dataArray = [NSArray arrayWithContentsOfFile:path];
  7. if (!dataArray)
  8. {
  9. MyLog(@"读取文件失败");
  10. return;
  11. }
  12. _msgList = [NSMutableArray arrayWithCapacity:dataArray.count];
  13. [dataArray enumerateObjectsUsingBlock:^(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
  14. Message *message = [[Message alloc] init];
  15. message.msg = dict[RMsgKey];
  16. message.mine = [dict[RMineKey] boolValue];
  17. [_msgList addObject:message];
  18. }];
  19. }

将数据指定给Message类,存到一个数组中方便以后绑定到自定义单元格中


这次使用的是用NIB文件建的自定义,而非像前两篇博客使用手绘的方式。




awakeFromNib和layoutSubviews方法


  1. - (void)awakeFromNib
  2. {
  3. _msgButton.titleLabel.numberOfLines = 0;
  4. _msgButton.titleLabel.font = [UIFont systemFontOfSize:RChatFontSize];
  5. }
  6. - (void)layoutSubviews
  7. {
  8. [super layoutSubviews];
  9. CGRect rect = _msgButton.frame;
  10. rect.size.height = self.bounds.size.height - 2*RMarginSize;
  11. _msgButton.frame = rect;
  12. }


然后是数据绑定方法,根据传入的数据,安排头像和会话按钮的位置


  1. - (void)bindMessage:(Message *)message
  2. {
  3. UIImage *headerImage;
  4. UIImage *normalImage;
  5. UIImage *highlightedImage;
  6. CGRect iconRect = _headerView.frame;
  7. CGRect btnRect = _msgButton.frame;
  8. UIEdgeInsets insets;
  9. if (message.isMine)
  10. {
  11. headerImage = [UIImage imageNamed:@"me"];
  12. normalImage = [UIImage imageNamed:@"mychat_normal"];
  13. highlightedImage = [UIImage imageNamed:@"mychat_focused"];
  14. iconRect.origin.x = RMarginSize;
  15. btnRect.origin.x = RBtnX;
  16. insets = UIEdgeInsetsMake(0, 20, 0, 30);
  17. }
  18. else
  19. {
  20. headerImage = [UIImage imageNamed:@"other"];
  21. normalImage = [UIImage imageNamed:@"other_normal"];
  22. highlightedImage = [UIImage imageNamed:@"other_focused"];
  23. iconRect.origin.x = self.bounds.size.width - RMarginSize - RIconSide;
  24. btnRect.origin.x = self.bounds.size.width - iconRect.origin.x - RMarginSize;
  25. insets = UIEdgeInsetsMake(0, 30, 0, 30);
  26. }
  27. _headerView.frame = iconRect;
  28. _headerView.image = headerImage;
  29. //拉伸图片
  30. normalImage = [normalImage stretchableImageWithLeftCapWidth:normalImage.size.width*0.5 topCapHeight:normalImage.size.height*0.6];
  31. highlightedImage = [highlightedImage stretchableImageWithLeftCapWidth:highlightedImage.size.width*0.5 topCapHeight:highlightedImage.size.height*0.6];
  32. [_msgButton setContentEdgeInsets:insets];
  33. _msgButton.frame = btnRect;
  34. [_msgButton setBackgroundImage:normalImage forState:UIControlStateNormal];
  35. [_msgButton setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
  36. [_msgButton setTitle:message.msg forState:UIControlStateNormal];
  37. }

关于上面拉伸图片的方法,在IOS6以后可以使用另一个方法,resizableImageWithCapInsets:<#(UIEdgeInsets)#> resizingMode:<#(UIImageResizingMode)#>

传入一个Edgeinsets和一个拉伸模式就可以对图片完成编辑。


下面在tableview的代理方法中设置自适应高度的行高


  1. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3. Message *msg = _msgList[indexPath.row];
  4. UIFont *font = [UIFont systemFontOfSize:RChatFontSize];
  5. CGFloat height = [msg.msg sizeWithFont:font constrainedToSize:CGSizeMake(150, 10000)].height;
  6. CGFloat lineHeight = [font lineHeight];
  7. return RCellHeight + height - lineHeight;
  8. }

根据内容和字体设置合适的高度


最后绑定数据就可以完成显示了


  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3. HRChatCell *cell = [tableView dequeueReusableCellWithIdentifier:RCellIdentifier];
  4. [cell bindMessage:_msgList[indexPath.row]];
  5. return cell;
  6. }


完成效果



Demo源码:点击打开链接



以上为本篇博客全部内容,欢迎指正和交流。转载请注明出处~


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/652288
推荐阅读
相关标签
  

闽ICP备14008679号