你的位置:首页 > 操作系统

[操作系统]即时通讯UI-聊天界面(UITableView显示左右两人聊天)


目录


3.计算自适应cell高度 ChatCellFrame

#import <Foundation/Foundation.h>#import "ChatModel.h"/** * cell中的布局,计算高度,位置等。。。 */@interface ChatCellFrame : NSObject@property (nonatomic,assign)CGRect iconRect; //图标位置大小@property (nonatomic,assign)CGRect chartViewRect;//内容位置大小@property (nonatomic,strong)ChatModel *chartMessage;//数据模型@property (nonatomic, assign) CGFloat cellHeight; //cell高度@end

#define kIconMarginX 5#define kIconMarginY 5#import "ChatCellFrame.h"@implementation ChatCellFrame//重写set方法- (void)setChartMessage:(ChatModel *)chartMessage {    _chartMessage=chartMessage;    CGSize winSize=[UIScreen mainScreen].bounds.size;  CGFloat iconX=kIconMarginX;  CGFloat iconY=kIconMarginY;  CGFloat iconWidth=40;  CGFloat iconHeight=40;  //当为类型1  if(chartMessage.messageType==ChatMessageFrom){      }  //当为类型2  else if (chartMessage.messageType==ChatMessageTo){    iconX=winSize.width-kIconMarginX-iconWidth;  }    //图标的位置大小  self.iconRect=CGRectMake(iconX, iconY, iconWidth, iconHeight);    CGFloat contentX=CGRectGetMaxX(self.iconRect)+kIconMarginX;  CGFloat contentY=iconY;  //设置字体大小  NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:13]};  //文本自适应大小    CGSize contentSize=[chartMessage.content boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options: NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;    if(chartMessage.messageType==ChatMessageTo){        contentX=iconX-kIconMarginX-contentSize.width-iconWidth;  }    //View的大小位置  self.chartViewRect=CGRectMake(contentX, contentY, contentSize.width+35, contentSize.height+30);    //cell高度  self.cellHeight=MAX(CGRectGetMaxY(self.iconRect), CGRectGetMaxY(self.chartViewRect))+kIconMarginX;}@end

4.设置cell上视图(图片和文字)ChatCellView

#import <UIKit/UIKit.h>#import "ChatModel.h"@interface ChatCellView : UIView@property (nonatomic,strong)UIImageView *iconImageView;@property (nonatomic,strong)UILabel *contentLabel;@property (nonatomic,strong)ChatModel *chartMessage;@end

#import "ChatCellView.h"#define kContentStartMargin 25@implementation ChatCellView- (id)initWithFrame:(CGRect)frame{  self = [super initWithFrame:frame];  if (self) {        self.iconImageView=[[UIImageView alloc]init];    self.iconImageView.userInteractionEnabled=YES;    [self addSubview:self.iconImageView];        self.contentLabel=[[UILabel alloc]init];    self.contentLabel.numberOfLines=0;    self.contentLabel.textAlignment=NSTextAlignmentLeft;    self.contentLabel.font=[UIFont fontWithName:@"HelveticaNeue" size:13];    [self addSubview:self.contentLabel];  }  return self;}//重写frame- (void)setFrame:(CGRect)frame {  [super setFrame:frame];    self.iconImageView.frame=self.bounds;  CGFloat contentLabelX=0;  if(self.chartMessage.messageType==ChatMessageFrom){        contentLabelX=kContentStartMargin*0.8;  }else if(self.chartMessage.messageType==ChatMessageTo){    contentLabelX=kContentStartMargin*0.5;  }  self.contentLabel.frame=CGRectMake(contentLabelX, -3, self.frame.size.width-kContentStartMargin-5, self.frame.size.height);}@end

5.在cell中添加视图,并将模型数据添加上去 ChatCell

#import <UIKit/UIKit.h>#import "ChatModel.h"#import "ChatCellFrame.h"#import "ChatCellView.h"@interface ChatCell : UITableViewCell@property (nonatomic,strong)ChatCellFrame *cellFrame;@end

#import "ChatCell.h"@interface ChatCell ()@property (nonatomic,strong) UIImageView *icon;@property (nonatomic,strong) ChatCellView *chartView;@property (nonatomic,strong) ChatCellView *currentChartView;@property (nonatomic,strong) NSString *contentStr;@end@implementation ChatCell- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];  if (self) {    self.icon = [[UIImageView alloc]init];    self.chartView =[[ChatCellView alloc]initWithFrame:CGRectZero];    [self.contentView addSubview:self.icon];    [self.contentView addSubview:self.chartView];  }  return self;}- (void)setCellFrame:(ChatCellFrame *)cellFrame {  _cellFrame=cellFrame;    ChatModel *chartMessage=cellFrame.chartMessage;    self.icon.frame=cellFrame.iconRect; //将图标位置赋给icon  self.icon.image=[UIImage imageNamed:chartMessage.icon];//图标    self.chartView.chartMessage=chartMessage;  self.chartView.frame=cellFrame.chartViewRect; //将内容位置赋给chartView  [self setBackGroundImageViewImage:self.chartView from:@"chatfrom_bg_normal.png" to:@"chatto_bg_normal.png"];  self.chartView.contentLabel.text=chartMessage.content; //设置文字信息}//根据不同类型更换不同的背景图-(void)setBackGroundImageViewImage:(ChatCellView *)chartView from:(NSString *)from to:(NSString *)to{  UIImage *normal=nil ;  if(chartView.chartMessage.messageType==ChatMessageFrom){        normal = [UIImage imageNamed:from];    normal = [normal stretchableImageWithLeftCapWidth:normal.size.width * 0.5 topCapHeight:normal.size.height * 0.7];      }else if(chartView.chartMessage.messageType==ChatMessageTo){        normal = [UIImage imageNamed:to];    normal = [normal stretchableImageWithLeftCapWidth:normal.size.width * 0.5 topCapHeight:normal.size.height * 0.7];  }  chartView.iconImageView.image=normal;}- (void)awakeFromNib {  // Initialization code}- (void)setSelected:(BOOL)selected animated:(BOOL)animated {  [super setSelected:selected animated:animated];  // Configure the view for the selected state}@end

6.回到控制器,设置数据源,(这里用的假数据),添加数据模型,使用自适应高度,使用自定义cell

#pragma mark - 懒加载- (NSArray *)array {  if (!_array) {    _array = [[NSMutableArray alloc]initWithObjects: @{@"icon":@"icon01.jpg",  @"content":@"早上好",  @"messageType":@"0"}, @{@"icon":@"icon02.jpg",  @"content":@"早上好呀",  @"messageType":@"1"}, nil];  }  return _array;}#pragma mark - 模型数据- (void)initDataSource {  _dataSource = [[NSMutableArray alloc]init];  for (NSDictionary *dic in self.array) {    ChatCellFrame *chatFrame = [[ChatCellFrame alloc]init];    ChatModel *chatModel = [ChatModel modelWithDic:dic];    chatFrame.chartMessage = chatModel;    [_dataSource addObject:chatFrame];  }}

#pragma mark - initView- (void)initView {  _tableView = [[UITableView alloc]initWithFrame:self.view.bounds];  _tableView.dataSource = self;  _tableView.delegate = self;  _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;  [_tableView registerClass:[ChatCell class] forCellReuseIdentifier:CELLID];  [self.view addSubview:_tableView];}#pragma mark - <UITableViewDataSource,UITableViewDelegate>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  return _dataSource.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    ChatCell *cell = [tableView dequeueReusableCellWithIdentifier:CELLID];  cell.cellFrame=_dataSource[indexPath.row];  cell.selectionStyle = UITableViewCellSelectionStyleNone;  return cell;}-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  return [_dataSource[indexPath.row] cellHeight];}

效果图:

 

几月份去迪拜旅游最好什么时候去迪拜旅游最便宜去迪拜旅游跟团要多少钱去迪拜旅游需要多少钱迪拜旅游大概多少钱信宜大仁山有公交车吗?到大仁山坐什么车去? 信宜怎么样去大仁山?茂名信宜大仁山交通线路? 信宜大仁山网上购票多少钱?大仁山门票预订? 信宜大仁山一日游攻略?茂名信宜大仁山门票多少钱? 台湾恋曲 小清新式的浪漫爱情引人入胜 游走澳门 品味一座小城两种不同文化 美女云集 全球公认女人最风骚的十个国家 端午去哪玩 端午游屈原投江地汨罗江攻略 成都离峨眉山有多远 九寨沟美食-洋芋糍粑 九寨沟离峨眉山多远 峨眉山竹叶青 清远新银盏温泉度假村在哪?怎么去清远新银盏温泉度假村? 2013年冬季增城白水寨有什么好玩的活动? 元旦高速免费吗? 观音山森林公园学生票多少钱?东莞观音山森林公园学生门票价格? ZTX692BSTZ Datasheet ZTX692BSTZ Datasheet ZTX694BSTOA Datasheet ZTX694BSTOA Datasheet ZTX694BSTOB Datasheet ZTX694BSTOB Datasheet 安吉旅游攻略 安吉旅游攻略 安吉旅游攻略 乌鲁木齐到喀纳斯 乌鲁木齐到喀纳斯 乌鲁木齐到喀纳斯 张家界自驾游攻略 张家界自驾游攻略 张家界自驾游攻略