IOS详解TableView——对话聊天布局的实现
上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局。这篇讲述如何利用自定义单元格来实现聊天界面的布局。
借助单元格实现聊天布局难度不大,主要要解决的问题有两个:
1.自己和其他人说话头像和气泡图像在不同的位置。
找了些类似的例子,有根据不同情况设置不同的自定义类的。这里使用根据说话人的属性来设置不同的位置,在一个单一的单元格类中。
2.像微博等根据说话的内容长短对说话图片进行拉伸,以及单元格自适应高度。
实现步骤:
搭建界面
数据属性字典
读取数据
- (void)loadData
{
const NSString *RMsgKey = @"msg";
const NSString *RMineKey = @"ismine"; NSString *path = [[NSBundle mainBundle] pathForResource:@"messages" ofType:@"plist"];
NSArray *dataArray = [NSArray arrayWithContentsOfFile:path];
if (!dataArray)
{
MyLog(@"读取文件失败");
return;
} _msgList = [NSMutableArray arrayWithCapacity:dataArray.count];
[dataArray enumerateObjectsUsingBlock:^(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
Message *message = [[Message alloc] init];
message.msg = dict[RMsgKey];
message.mine = [dict[RMineKey] boolValue];
[_msgList addObject:message];
}];
}
将数据指定给Message类,存到一个数组中方便以后绑定到自定义单元格中
这次使用的是用NIB文件建的自定义,而非像前两篇博客使用手绘的方式。
awakeFromNib和layoutSubviews方法
- (void)awakeFromNib
{
_msgButton.titleLabel.numberOfLines = 0;
_msgButton.titleLabel.font = [UIFont systemFontOfSize:RChatFontSize];
} - (void)layoutSubviews
{
[super layoutSubviews]; CGRect rect = _msgButton.frame;
rect.size.height = self.bounds.size.height - 2*RMarginSize;
_msgButton.frame = rect;
}
然后是数据绑定方法,根据传入的数据,安排头像和会话按钮的位置
- (void)bindMessage:(Message *)message
{
UIImage *headerImage;
UIImage *normalImage;
UIImage *highlightedImage; CGRect iconRect = _headerView.frame;
CGRect btnRect = _msgButton.frame; UIEdgeInsets insets; if (message.isMine)
{
headerImage = [UIImage imageNamed:@"me"];
normalImage = [UIImage imageNamed:@"mychat_normal"];
highlightedImage = [UIImage imageNamed:@"mychat_focused"]; iconRect.origin.x = RMarginSize;
btnRect.origin.x = RBtnX; insets = UIEdgeInsetsMake(0, 20, 0, 30);
}
else
{
headerImage = [UIImage imageNamed:@"other"];
normalImage = [UIImage imageNamed:@"other_normal"];
highlightedImage = [UIImage imageNamed:@"other_focused"]; iconRect.origin.x = self.bounds.size.width - RMarginSize - RIconSide;
btnRect.origin.x = self.bounds.size.width - iconRect.origin.x - RMarginSize; insets = UIEdgeInsetsMake(0, 30, 0, 30);
}
_headerView.frame = iconRect;
_headerView.image = headerImage; //拉伸图片
normalImage = [normalImage stretchableImageWithLeftCapWidth:normalImage.size.width*0.5 topCapHeight:normalImage.size.height*0.6];
highlightedImage = [highlightedImage stretchableImageWithLeftCapWidth:highlightedImage.size.width*0.5 topCapHeight:highlightedImage.size.height*0.6]; [_msgButton setContentEdgeInsets:insets];
_msgButton.frame = btnRect;
[_msgButton setBackgroundImage:normalImage forState:UIControlStateNormal];
[_msgButton setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
[_msgButton setTitle:message.msg forState:UIControlStateNormal];
}
关于上面拉伸图片的方法,在IOS6以后可以使用另一个方法,resizableImageWithCapInsets:<#(UIEdgeInsets)#> resizingMode:<#(UIImageResizingMode)#>
传入一个Edgeinsets和一个拉伸模式就可以对图片完成编辑。
下面在tableview的代理方法中设置自适应高度的行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
Message *msg = _msgList[indexPath.row];
UIFont *font = [UIFont systemFontOfSize:RChatFontSize];
CGFloat height = [msg.msg sizeWithFont:font constrainedToSize:CGSizeMake(150, 10000)].height;
CGFloat lineHeight = [font lineHeight]; return RCellHeight + height - lineHeight;
}
根据内容和字体设置合适的高度
最后绑定数据就可以完成显示了
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
HRChatCell *cell = [tableView dequeueReusableCellWithIdentifier:RCellIdentifier];
[cell bindMessage:_msgList[indexPath.row]];
return cell;
}
完成效果
Demo源码:点击打开链接
以上为本篇博客全部内容,欢迎指正和交流。转载请注明出处~
IOS详解TableView——对话聊天布局的实现的更多相关文章
- IOS详解TableView——选项抽屉(天猫商品列表)
在之前的有篇文章讲述了利用HeaderView来写类似QQ好友列表的表视图. 这里写的天猫抽屉其实也可以用该方法实现,具体到细节每个人也有所不同.这里采用的是点击cell对cell进行运动处理以展开“ ...
- IOS详解TableView——内置刷新,EGO,以及搜索显示控制器
内置刷新 内置刷新是苹果IOS6以后才推出的一个API,主要是针对TableViewController增加了一个属性,refreshControl,所以如果想用这个内置下拉刷新的话,最好给你的Tab ...
- Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
[Android布局学习系列] 1.Android 布局学习之——Layout(布局)详解一 2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数) 3.And ...
- iOS:详解MJRefresh刷新加载更多数据的第三方库
原文链接:http://www.ios122.com/2015/08/mjrefresh/ 简介 MJRefresh这个第三方库是李明杰老师的杰作,这个框架帮助我们程序员减轻了超级多的麻烦,节约了开发 ...
- Xamarin+Prism开发详解五:页面布局基础知识
说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...
- QDockWidget嵌套布局详解-实现Visual Studio布局
概述 许多工程软件,如Qt Creator,VS,matlab等,都是使用dock布局窗口,这样用户可以自定义界面,自由组合窗口. Qt的嵌套布局由QDockWidget完成,用Qt Creator拖 ...
- [iOS]详解调整UIButton的title和image的位置
UIButton的默认布局是:title在右,image在左; 很多时候我们需要的是title在左边,或者title在下面,这时就需要调整UIButton的TitleLabel和ImageView的位 ...
- 详解CSS的Flex布局
本文由云+社区发表 Flex是Flexible Box 的缩写,意为"弹性布局",是CSS3的一种布局模式.通过Flex布局,可以很优雅地解决很多CSS布局的问题.下面会分别介绍容 ...
- Android五大布局详解——TableLayout(表格布局)
TableLayout 前面所学的LinearLayout和RelativeLayout两大布局已经完全适用于各种开发条件下,其他的布局仅供参考学习,毕竟知识就是力量,以后的开发过程中万一遇到也能游刃 ...
随机推荐
- 简单浮点数除法模拟-hdu-4493-Tutor
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4493 题目意思: 给小数点后两位的12个月的工资,求出平均工资,输出离小数点后第二位最近的两位小数, ...
- RAC Cache Fusion 原理理解
cache fusion . grd . drm . gcs . ges cache fusion 1.RAC是一个数据库执行在多个实例上.通过DLM(Distributed ...
- VS 2013--工程的创建,scanf报错,常用快捷键,行号设置
一.创建一个工程(这里是C++,其他的一样的) 在vs页面上点击 文件-->新建-->项目: 会出现如下界面,自己改名字和存贮位置就可以了 确定,然后点击下一步: 这样就建好了一个工程,然 ...
- BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
- DE1-SOC连接设定
将电源供应器插上电源接口. 使用白色的USB Type B线材将计算机与DE1-SoC上的USB-Blaster II接口连接.此接口主要负责FPGA配置以及HPS Debug使用. 使用Mini-U ...
- redis(三)redis+Keepalived主从热备秒级切换
一 简介 安装使用centos 5.10 Master 192.168.235.135 Slave 192.168.235.152 Vip 192.168.235.200 编译环境 yum -y in ...
- 转:MySql的commit和rollback
从功能上划分,SQL 语言可以分为DDL,DML和DCL三大类.1. DDL(Data Definition Language) 数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 ...
- 临时节点不能有child 子节点
[zk: 127.0.0.1:2181(CONNECTED) 67] create '/zk01/0001/aaaa' dada Ephemerals cannot have children: /z ...
- java生产者消费者问题代码分析
作者要的是一个生产者生成,接着必须有一个消费者消费,那这不是需要单线程吗?或者使用1个大小的阻塞队列.所以只谈论问题本身,不谈论好不好. 具体代码: import java.util.concurre ...
- [置顶] 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...