WFCUCompositeMessageViewController.m 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // WFCUCompositeMessageViewController.m
  3. // WFChatUIKit
  4. //
  5. // Created by Tom Lee on 2020/10/4.
  6. // Copyright © 2020 WildFireChat. All rights reserved.
  7. //
  8. #import "WFCUCompositeMessageViewController.h"
  9. #import <WFChatClient/WFCChatClient.h>
  10. #import "WFCUUtilities.h"
  11. #import "WFCUCompositeBaseCell.h"
  12. #import "WFCUCompositeTextCell.h"
  13. @interface WFCUCompositeMessageViewController () <UITableViewDelegate, UITableViewDataSource>
  14. @property(nonatomic, strong)UITableView *tableView;
  15. @property(nonatomic, strong)NSMutableArray<WFCCMessage *> *messages;
  16. @end
  17. @implementation WFCUCompositeMessageViewController
  18. - (void)viewDidLoad {
  19. [super viewDidLoad];
  20. self.view.backgroundColor = [UIColor whiteColor];
  21. self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
  22. self.tableView.delegate = self;
  23. self.tableView.dataSource = self;
  24. self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  25. self.messages = [[NSMutableArray alloc] initWithArray:self.compositeContent.messages];
  26. [self setupTableHeaderView];
  27. self.title = self.compositeContent.targetName;
  28. self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
  29. [self.tableView reloadData];
  30. [self.view addSubview:self.tableView];
  31. }
  32. - (void)setupTableHeaderView {
  33. #define HEADER_HEIGHT 30
  34. #define HEADER_FONT_SIZE 16
  35. #define HEADER_LINE_PADDING 16
  36. NSDate *from = [[NSDate alloc] initWithTimeIntervalSince1970:self.messages.firstObject.serverTime/1000];
  37. NSDate *to = [[NSDate alloc] initWithTimeIntervalSince1970:self.messages.lastObject.serverTime/1000];
  38. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  39. [dateFormatter setDateFormat:@"yyyy-MM-dd"];
  40. [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
  41. NSString *fromString = [dateFormatter stringFromDate:from];
  42. NSString *toString = [dateFormatter stringFromDate:to];
  43. CGFloat width = self.view.frame.size.width;
  44. UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, HEADER_HEIGHT)];
  45. NSString *timeString;
  46. if ([fromString isEqualToString:toString]) {
  47. timeString = fromString;
  48. } else {
  49. timeString = [NSString stringWithFormat:@"%@ 至 %@", fromString, toString];
  50. }
  51. CGSize size = [WFCUUtilities getTextDrawingSize:timeString font:[UIFont systemFontOfSize:HEADER_FONT_SIZE] constrainedSize:CGSizeMake(width, HEADER_HEIGHT)];
  52. UIView *leftLine = [[UIView alloc] initWithFrame:CGRectMake(HEADER_LINE_PADDING, HEADER_HEIGHT/2, (width-size.width)/2-HEADER_LINE_PADDING-HEADER_LINE_PADDING, 1)];
  53. leftLine.backgroundColor = [UIColor grayColor];
  54. [headerView addSubview:leftLine];
  55. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake((width-size.width)/2, (HEADER_HEIGHT-size.height)/2, size.width, size.height)];
  56. label.text = timeString;
  57. label.textColor = [UIColor grayColor];
  58. label.font = [UIFont systemFontOfSize:HEADER_FONT_SIZE];
  59. [headerView addSubview:label];
  60. UIView *rightLine = [[UIView alloc] initWithFrame:CGRectMake((width+size.width)/2+HEADER_LINE_PADDING, HEADER_HEIGHT/2, (width-size.width)/2-HEADER_LINE_PADDING-HEADER_LINE_PADDING, 1)];
  61. rightLine.backgroundColor = [UIColor grayColor];
  62. [headerView addSubview:rightLine];
  63. self.tableView.tableHeaderView = headerView;
  64. }
  65. #pragma mark - UITableViewDataSource
  66. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  67. return self.compositeContent.messages.count;
  68. }
  69. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  70. WFCCMessage *msg = self.messages[indexPath.row];
  71. WFCUCompositeBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([msg.content class])];
  72. if (!cell) {
  73. cell = [WFCUCompositeBaseCell cellOfMessage:msg];
  74. }
  75. if (indexPath.row == self.messages.count-1) {
  76. cell.lastMessage = YES;
  77. } else {
  78. cell.lastMessage = NO;
  79. }
  80. BOOL sameUser = NO;
  81. if (indexPath.row != 0) {
  82. WFCCMessage *premsg = self.messages[indexPath.row-1];
  83. if ([premsg.fromUser isEqualToString:msg.fromUser]) {
  84. sameUser = YES;
  85. }
  86. }
  87. cell.hiddenPortrait = sameUser;
  88. cell.message = msg;
  89. return cell;
  90. }
  91. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  92. WFCCMessage *msg = self.messages[indexPath.row];
  93. WFCUCompositeBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([msg.content class])];
  94. if (!cell) {
  95. cell = [WFCUCompositeBaseCell cellOfMessage:msg];
  96. }
  97. return [cell.class heightForMessage:msg];
  98. }
  99. @end