首页 > 代码库 > 源码-0205-02--聊天布局02

源码-0205-02--聊天布局02

 

技术分享

//  XMGChatingViewController.m//  07-聊天布局#import "XMGChatingViewController.h"#import "XMGMessage.h"#import "XMGMessageCell.h"@interface XMGChatingViewController () <UITableViewDataSource, UITableViewDelegate>@property (nonatomic, strong) NSArray *messages;@end@implementation XMGChatingViewController- (NSArray *)messages{    if (_messages == nil) {        // 加载plist中的字典数组        NSString *path = [[NSBundle mainBundle] pathForResource:@"messages.plist" ofType:nil];        NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];                // 字典数组 -> 模型数组        NSMutableArray *messageArray = [NSMutableArray array];        // 用来记录上一条消息模型        XMGMessage *lastMessage = nil;        for (NSDictionary *dict in dictArray) {            XMGMessage *message = [XMGMessage messageWithDict:dict];            message.hideTime = [message.time isEqualToString:lastMessage.time];            [messageArray addObject:message];                        lastMessage = message;        }                _messages = messageArray;    }    return _messages;}- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    }- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}#pragma mark - <UITableViewDataSource>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return self.messages.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    XMGMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"message"];        cell.message = self.messages[indexPath.row];        return cell;}#pragma mark - <UITableViewDelegate>- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{    return 200;}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{    XMGMessage *message = self.messages[indexPath.row];    return message.cellHeight;}@end

 

技术分享

//  XMGMessage.h//  07-聊天布局#import <UIKit/UIKit.h>typedef enum {    XMGMessageTypeMe = 0,    XMGMessageTypeOther = 1} XMGMessageType;@interface XMGMessage : NSObject@property (nonatomic, strong) NSString *text;@property (nonatomic, strong) NSString *time;@property (nonatomic, assign) XMGMessageType type;/** cell的高度 */@property (nonatomic, assign) CGFloat cellHeight;/** 是否隐藏时间 */@property (nonatomic, assign, getter=isHideTime) BOOL hideTime;+ (instancetype)messageWithDict:(NSDictionary *)dict;@end
//  XMGMessage.m//  07-聊天布局#import "XMGMessage.h"@implementation XMGMessage+ (instancetype)messageWithDict:(NSDictionary *)dict{    XMGMessage *message = [[self alloc] init];    [message setValuesForKeysWithDictionary:dict];    return message;}@end

技术分享

//  XMGMessageCell.h//  07-聊天布局#import <UIKit/UIKit.h>@class XMGMessage;@interface XMGMessageCell : UITableViewCell@property (nonatomic, strong) XMGMessage *message;@end
//  XMGMessageCell.m//  07-聊天布局#import "XMGMessageCell.h"#import "XMGMessage.h"//define this constant if you want to use Masonry without the ‘mas_‘ prefix#define MAS_SHORTHAND//define this constant if you want to enable auto-boxing for default syntax#define MAS_SHORTHAND_GLOBALS#import "Masonry.h"@interface XMGMessageCell()@property (weak, nonatomic) IBOutlet UILabel *timeLabel;@property (weak, nonatomic) IBOutlet UIButton *textButton;@property (weak, nonatomic) IBOutlet UIImageView *iconView;@property (weak, nonatomic) IBOutlet UIButton *otherTextButton;@property (weak, nonatomic) IBOutlet UIImageView *otherIconView;@end@implementation XMGMessageCell- (void)awakeFromNib{    self.textButton.titleLabel.numberOfLines = 0;    self.otherTextButton.titleLabel.numberOfLines = 0;}- (void)setMessage:(XMGMessage *)message{    _message = message;        if (message.hideTime) { // 隐藏时间        self.timeLabel.hidden = YES;        [self.timeLabel updateConstraints:^(MASConstraintMaker *make) {            make.height.equalTo(0);        }];    } else { // 显示时间        self.timeLabel.text = message.time;        self.timeLabel.hidden = NO;        [self.timeLabel updateConstraints:^(MASConstraintMaker *make) {            make.height.equalTo(21);        }];    }        if (message.type == XMGMessageTypeMe) { // 右边        [self settingShowTextButton:self.textButton showIconView:self.iconView hideTextButton:self.otherTextButton hideIconView:self.otherIconView];    } else { // 左边        [self settingShowTextButton:self.otherTextButton showIconView:self.otherIconView hideTextButton:self.textButton hideIconView:self.iconView];    }}/** * 处理左右按钮、头像 */- (void)settingShowTextButton:(UIButton *)showTextButton showIconView:(UIImageView *)showIconView hideTextButton:(UIButton *)hideTextButton hideIconView:(UIImageView *)hideIconView{    hideTextButton.hidden = YES;    hideIconView.hidden = YES;        showTextButton.hidden = NO;    showIconView.hidden = NO;        // 设置按钮的文字    [showTextButton setTitle:self.message.text forState:UIControlStateNormal];        // 强制更新    [showTextButton layoutIfNeeded];        // 设置按钮的高度就是titleLabel的高度    [showTextButton updateConstraints:^(MASConstraintMaker *make) {        CGFloat buttonH = showTextButton.titleLabel.frame.size.height;        make.height.equalTo(buttonH);    }];        // 强制更新    [showTextButton layoutIfNeeded];        // 计算当前cell的高度    CGFloat buttonMaxY = CGRectGetMaxY(showTextButton.frame);    CGFloat iconMaxY = CGRectGetMaxY(showIconView.frame);    self.message.cellHeight = MAX(buttonMaxY, iconMaxY) + 10;}@end

 

源码-0205-02--聊天布局02