气泡聊天

现在大部分的聊天工具,像QQ,微信等及时聊天都有各种的小气泡包含着所要发送的文字,对其进行了一部分的整理,可能不全,仅供自己参考

①首先聊天的页面其实是个tableView,因为都是一行一条信息的,只要把它的分割线去掉就可以让其一条条的显示。

②在你向文本框输入信息的时候,文本框和发送按钮要随着键盘移动而移动,所以要将textFiled和Button同时放到一个view上面,整体上下移动。

 1 _dataArray = [[NSMutableArray alloc] init];
 2     CGSize winSize  = self.view.frame.size;
 3     _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,0, winSize.width, winSize.height-40)];
 4     //去掉分割线
 5     _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
 6     _tableView.delegate = self;
 7     _tableView.dataSource = self;
 8     [self.view addSubview:_tableView];
 9
10
11     _chatView = [[UIView alloc] initWithFrame:CGRectMake(0, winSize.height-40, winSize.width, 40)];
12     _chatView.backgroundColor = [UIColor grayColor];
13     [self.view addSubview:_chatView];
14
15     _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 5, winSize.width-60, 30)];
16     _textField.borderStyle = UITextBorderStyleRoundedRect;
17     [_chatView addSubview:_textField];
18
19     UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
20     btn.frame = CGRectMake(winSize.width-40, 5, 30, 30);
21     [btn setTitle:@"发送" forState:UIControlStateNormal];
22     [btn addTarget:self action:@selector(sendText) forControlEvents:UIControlEventTouchUpInside];
23     [_chatView addSubview:btn];

③怎么判断在键盘出现和消失的时候,view应该上下移动多少呢,需要对键盘加监听,得到键盘的高度

 //监听键盘出现
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    //监听键盘消失
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

④在键盘出现和消失的时候对_tableView和_chatView进行调整

 1 //键盘出现
 2 - (void)keyboardWillShow:(NSNotification *)noti
 3 {
 4     //键盘的高度
 5     CGSize size = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
 6     //屏幕宽高
 7     CGSize winSize = self.view.frame.size;
 8     //tableView的大小
 9     _tableView.frame = CGRectMake(0, 0, winSize.width, winSize.height-40-size.height);
10     //ChatView的位置
11     _chatView.frame = CGRectMake(0, winSize.height-40-size.height, winSize.width, 40);
12 }
13 //键盘消失
14 - (void)keyboardWillHide:(NSNotification *)noti
15 {
16     //屏幕宽高
17     CGSize winSize = self.view.frame.size;
18     //tableView的大小恢复
19     _tableView.frame = CGRectMake(0, 0, winSize.width, winSize.height-40);
20     //ChatView的位置恢复
21     _chatView.frame = CGRectMake(0, winSize.height-40, winSize.width, 40);
22 }

⑤在自定义cell的时候要计算文本所占的大小,当是自己发送的时候,将左边的Bubble隐藏掉,右边的开启,在此要重新计算label气泡的大小

CGSize size = [chatModel.content boundingRectWithSize:CGSizeMake(250, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0]} context:nil].size;
    CGSize winSize = [[UIScreen mainScreen] bounds].size;
    if(chatModel.isSelf){
        //自己发得
        cell.rightBubble.hidden = NO;
        cell.leftBubble.hidden = YES;
        //显示文本
        cell.rightLabel.text = chatModel.content;
        //重新计算label和气泡的大小
        cell.rightLabel.frame = CGRectMake(10, 5, size.width, size.height);
        cell.rightBubble.frame = CGRectMake(winSize.width-size.width-40, 5, size.width+25, size.height+15);
    }

⑥tableView的行高也是根据文本所占大小来调整的,在此不贴代码了。

⑦最后就是发送文本的过程,在点击发送按钮的时候,将文本框里的内容给ChatModel模型,发送之后将文本框置空,由于在发送的过程中,键盘会挡住tableView上显示的文本,所以要每一次添加一行

 1 ChatModel *chatModel = [[ChatModel alloc] init];
 2     chatModel.content = _textField.text;
 3     chatModel.isSelf = YES;
 4     _textField.text = @"";
 5     [_dataArray addObject:chatModel];
 6     //添加一行
 7     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_dataArray.count-1 inSection:0];
 8     [_tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
 9     //滚动到最后一行
10     [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
时间: 2024-08-10 21:29:21

气泡聊天的相关文章

模仿QQ气泡聊天

尝试了几种方案,想模仿QQ的气泡聊天,总是不尽如意.网上倒是大把的Android和Html的例子,Delphi的没找着,只能自己试着折腾. 1. 用WebBrowser加载本地html,屡次折腾,失败. 遇到的问题是(1)CSS3效果显示不出来(2)不熟悉JS,没整明白如何加载记录.刷新数据. 2. VCLForm中加载FMXForm, 效果倒是出来了,跟下图相差不大,但是结果还是失败. 遇到的问题是(1)使用的FireMonkey控件有几个报错没搞定(2)引用了FMX相关的单元后,编译出来的e

android 仿QQ气泡聊天界面

1.现在的QQ,微信等一些APP的聊天界面都是气泡聊天界面,左边是接收到的消息,右边是发送的消息, 这个效果其实就是一个ListView在加载它的Item的时候,分别用了不同的布局xml文件. 2.效果图(其中的聊天信息框是采用了.9.png的图片): 3.对中间聊天的的listView进行说明: 左边Item的xml文件效果如下: 右边Item的xml文件效果如下: 4.在加载ListView当中重写getView()方法,通过判断消息传入类型,来使item加载哪一个xml文件: 自定义ada

基于Qt的类QQ气泡聊天的界面开发

最近在写IM 聊天界面,想设计出一个类似QQ气泡聊天的样式 使用了几种办法 1:使用Qt下面的QListview来实现QQ类似效果,差强人意 2:使用QWebview加载html css样式来完成,发现效果不错,但是毕竟webview占用巨大的内存 3:使用QTextBrower加载css,但是好像只支持css2.1版本,css3完全不支持,这样的话,花哨的样式应该是无法实现 基于以上三种思路 最后发现还是QML实现比较好,但是qml基于文本与动画图片混合显示没找到好的办法,有好的办法的希望可以

转-Android仿微信气泡聊天界面设计

微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素材,要用到9.png文件的素材,这样气泡会随着聊天内容的多少而改变气泡的大小且不失真.为了方便,我就直接在微信里面提取出来啦. 聊天的内容是用ListView来显示的,将聊天的内容封装成一个ChatMsgEntity类的对象里面,然后交给自定义的ListView适配器将聊天内容显示出来. ChatMsgEntity.java比较简单,只

DUILIB 实现微信气泡聊天效果

最近由于项目原因,需要做一个产品内嵌的IM聊天系统.而且要象微信类似的效果:界面也要比较炫: 开始考虑用MFC,但MFC的控件自绘很麻烦,后来又考虑QT,倒是使用控件使用方便,但QT库太大,所以也放弃了. 最终选择了DUILIB ,原因是各种控制自绘方便,发布版本体积小. 说到聊天,大家可能首先想到发图片,文字等等,所以也想想用richedit控件,看了看DUILIB也实现了RICHEDIT控件: 但气泡聊天效果其实不用RICHEDIT控件,用RICHEDIT控件反应会很麻烦.由于之前做过IOS

高仿QQ源码下载 (android前端+JAVA后台+spark<windows版聊天>)方便集成到自己系统

 A openfire (XMPP+开源源码); B android前端源码(仿QQ高大上UI); C JAVA后台源码(UI高大上HTML5);  Dspark(windows版);  系统主要实现为:JAVA后台(springmvc+mybaits)+openfire(xmpp推送)+android(asmark+ActiveAndroid+async-http+universal-image-loader)+spark(windows版);  android前端 1.集成Activie

使用QGraphicsView实现气泡聊天窗口+排雷

经过多方调查,用Qt实现气泡聊天窗口的方式有如下几个: 使用QWebEngineView控件内嵌html+CSS 使用QTextEdit内嵌html 使用QGraphicsView实现 使用QWidget自己绘制气泡样式实现 作为一名C++程序员,对CSS+html这套结构的不熟悉导致无法使用前两个方案,而第三个方案又不够高效,所以最终我选择了最后一个方案. 最终效果: 存在问题:无法选择文字及跨选(但理论上可以通过重写鼠标相关事件,达到模拟选择的效果) 左侧和右侧的消息分别是封装的两个Item

自己总结的 iOS ,Mac 开源项目以及库,知识点------持续更新

自己在 git  上看到一个非常好的总结的东西,但是呢, fork  了几次,就是 fork  不到我的 git 上,干脆复制进去,但是,也是认真去每一个每一个去认真看了,并且也是补充了一些,感觉非常棒,所以好东西要分享,为啥用 CN 博客,有个好处,可以随时修改,可以持续更新,不用每次都要再发表,感觉这样棒棒的 我们 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.

iOS小知识点

获取图片缓存 1.导入 #import "SDImageCache.h" //把B单位转换为M [NSString stringWithFormat:@"%.2fM",(double)[[SDImageCache sharedImageCache] getSize]/1000/1000]; 清除图片缓存 [[SDImageCache sharedImageCache] clearDisk]; 获取某文件夹中所有文件缓存 //文件夹枚举器,可以枚举这个文件夹内以及这个