以下是YYKit组件的源码分析,高级性能优化相关都在里面可以找到

YYwebImage超细源码分析
YYImage超细源码分析
YYModel源码分析
YYText源码分析

12.27日更新:分析了一个很牛B的聊天UI框架


进阶版高级UI实现

帅气的我又来了,是不是帅气逼人。。。。。。

来说说又是早些前,去面试了一些公司,有些喜欢打电话让你说说runtime,runloop什么的,这还好,关键遇到一个吊炸天的公司,我和一个哥们两个人去面试,到那里没都人理你啊,面试题也没有,坐在那发呆,接待我们的人很久才来,正好他们要写什么聊天功能还是干嘛,突然让我们两个快速撸一个聊天功能的界面,我没听错吧???!!!

当时,深井冰啊,尼玛深井冰啊,谁有空帮你们写demo啊,那么问题来了,尼玛就

一台电脑,我看了那个哥们,我果断告诉他我接个电话,,等我回来的时候,哥们已经在写tableView了,这代码风格,一看就不是本地人,赶紧坐在那膜拜。。。。。。这哥们写了很久,反正没写出来,然后那人一来问了他几句,,然后就没有然后了。

鸡汁的我一想,这个界面几秒钟不搞定了么

          

哎呦喂,看官别走啊,咱说点正事,他一看时间已经五点了,就说先这样吧。

喂喂喂!!! 110么,这里有人装逼,我还没操作呢,什么鬼啊???!!!

这什么面试啊,看别人写Demo啊,辣么奇葩的面试官

还告诉我等电话通知哦,亲。。。。。。

有完没完啊你,哎,sb博主,你弱智么,还写不写啊。。。。。。

上图

NOTE:

A: 需要注意键盘的监听高度问题

B:,气泡就这么小的,我们需要根据文本拉伸

stretchableImageWithLeftCapWidth:topCapHeight:  --->拉伸气泡

用它计算文本(boundingRectWithSize:)具体参数看文档吧

C:每次发文字的时候让ScrollView滚动到最后一个cell,用户可见

1.首先Demo这次没用AutoLayout布局了,来看下关键的cell部分以及键盘部分

@property (nonatomic,strong) UIImageView *headImageView; // 用户头像
@property (nonatomic,strong) UIImageView *backView; // 气泡
@property (nonatomic,strong) UILabel *contentLabel; // 气泡内文本- (void)refreshCell:(MKJChatModel *)model; // 安装我们的cell
- (void)refreshCell:(MKJChatModel *)model
{// 首先计算文本宽度和高度CGRect rec = [model.msg boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:17]} context:nil];// 气泡UIImage *image = nil;// 头像UIImage *headImage = nil;// 模拟左边if (!model.isRight){// 当输入只有一个行的时候高度就是20多一点self.headImageView.frame = CGRectMake(10, rec.size.height - 18, 50, 50);self.backView.frame = CGRectMake(60, 10, rec.size.width + 20, rec.size.height + 20);image = [UIImage imageNamed:@"bubbleSomeone"];headImage = [UIImage imageNamed:@"head.JPG"];}else // 模拟右边{self.headImageView.frame = CGRectMake(375 - 60, rec.size.height - 18, 50, 50);self.backView.frame = CGRectMake(375 - 60 - rec.size.width - 20, 10, rec.size.width + 20, rec.size.height + 20);image = [UIImage imageNamed:@"bubbleMine"];headImage = [UIImage imageNamed:@"naruto@3x"];
//        image.leftCapWidth        }// 拉伸图片 参数1 代表从左侧到指定像素禁止拉伸,该像素之后拉伸,参数2 代表从上面到指定像素禁止拉伸,该像素以下就拉伸image = [image stretchableImageWithLeftCapWidth:image.size.width/2 topCapHeight:image.size.height/2];self.backView.image = image;self.headImageView.image = headImage;// 文本内容的frameself.contentLabel.frame = CGRectMake(model.isRight ? 5 : 13, 5, rec.size.width, rec.size.height);self.contentLabel.text = model.msg;
}

2.控制器注册两个监听

// 注册键盘的通知hide or show[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardShow:) name:UIKeyboardWillShowNotification object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil];
// 监听键盘弹出
- (void)keyBoardShow:(NSNotification *)noti
{// 获取到的Noti信息是这样的
//    NSConcreteNotification 0x7fde0a598bd0 {name = UIKeyboardWillShowNotification; userInfo = {
//        UIKeyboardAnimationCurveUserInfoKey = 7;
//        UIKeyboardAnimationDurationUserInfoKey = "0.25";
//        UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {375, 258}}";
//        UIKeyboardCenterBeginUserInfoKey = "NSPoint: {187.5, 796}";
//        UIKeyboardCenterEndUserInfoKey = "NSPoint: {187.5, 538}";
//        UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 667}, {375, 258}}";
//        UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}";      就是他
//        UIKeyboardIsLocalUserInfoKey = 1;
//    }}// 咱们取自己需要的就好了CGRect rec = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];NSLog(@"%@",NSStringFromCGRect(rec));// 小于,说明覆盖了输入框if ([UIScreen mainScreen].bounds.size.height - rec.size.height < self.inputView.frame.origin.y + self.inputView.frame.size.height){// 把我们整体的View往上移动CGRect tempRec = self.view.frame;tempRec.origin.y = - (rec.size.height);self.view.frame = tempRec;}// 由于可见的界面缩小了,TableView也要跟着变化Frameself.tableView.frame = CGRectMake(0, rec.size.height+64, 375, 667 - 64 - rec.size.height - 30);if (self.dataSouce.count != 0){[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.dataSouce.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];}}
// 监听键盘隐藏
- (void)keyboardHide:(NSNotification *)noti
{self.view.frame = CGRectMake(0, 0, 375, 667);self.tableView.frame = CGRectMake(0, 64, 375, 667 - 64 - 30);
}

3.这里的数据是模拟的,大致如下

- (void)clickSengMsg:(UIButton *)btn
{if (![self.inputView.textField.text isEqualToString:@""]){MKJChatModel *chatModel = [[MKJChatModel alloc] init];chatModel.msg = self.inputView.textField.text;chatModel.isRight = arc4random() % 2; // 0 or 1[self.dataSouce addObject:chatModel];}[self.tableView reloadData];// 滚到底部  scroll so row of interest is completely visible at top/center/bottom of viewif (self.dataSouce.count != 0) {[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.dataSouce.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];}
}

关键的就这么多,一个简单的Demo就完成了,抛砖引玉,各位需要完善的自己再完 善,需要跑起来试试的,记得用iphone6的屏幕跑哦,没做适配。。。。。。

Demo请戳:https://github.com/DeftMKJ/Chat

TableViewCell入门版高度自适应传送门:http://blog.csdn.net/deft_mkjing/article/details/51569605

微信朋友圈纯Autolayout高度自适应:点击打开链接

iOS 类似微信,QQ聊天界面的气泡聊天简单实现Demo相关推荐

  1. #解决仿微信聊天界面键盘遮盖聊天的界面

    解决仿微信聊天界面键盘遮盖聊天的界面 注意聊天界面的activity一定不能处于全屏模式 //第一步设置属性 <!--模拟的布局文件--><?xml version="1. ...

  2. java qq邮箱服务器端口_[Java教程]javamail 利用qq邮箱做邮箱服务器,简单小demo

    [Java教程]javamail 利用qq邮箱做邮箱服务器,简单小demo 0 2016-07-12 10:00:10 首先maven:javax.mailmail1.4.1 用户名密码验证:1 pu ...

  3. C++ Qt 实现微信聊天界面、气泡消息、gif斗图、表情包

    目录 聊天界面设计 QWebEngineView的使用 发送消息 demo源码链接 在使用Qt开发项目时,如果有气泡消息的需求,那将是很麻烦的事情,相比其它控件的自定义,气泡消息比较复杂,例如下图: ...

  4. php写的微信聊天界面,浅谈 聊天界面 核心架构设计

    本文以一个小例子简单的演示在微信小程序中使用环信SDK收发消息.官网demo 下载后把整个utils目录下的文件复制到咱自己工程的目录下.在WebIMConfig.js中将AppKey替换成自己应用的 ...

  5. android聊天界面对话气泡_聊天会话框气泡(示例代码)

    1.聊天会话框气泡的实现 我们将一个div的width.height.font-size设置为0,给它一个border-width值,border-color给定四种不同的颜色,此时我们会看到该div ...

  6. Qt+html+JavaScript实现类似QQ聊天界面的气泡效果

    这是一个简单的类似QQ聊天界面的Demo,用Qt实现,在QWebView里嵌入网页的方式实现.先看效果图: 无论怎样,我觉得自己动手写出来的东西才是自己的,所以源码不全,重点的代码我会放上来.只是模拟 ...

  7. android聊天界面对话气泡_android 模仿QQ聊天气泡 入门级示例源码

    [实例简介] [实例截图] [核心代码] package com.study.androidtest; import java.util.ArrayList; import android.app.A ...

  8. swift实现ios类似微信输入框跟随键盘弹出的效果

    为什么要做这个效果 在聊天app,例如微信中,你会注意到一个效果,就是在你点击输入框时输入框会跟随键盘一起向上弹出,当你点击其他地方时,输入框又会跟随键盘一起向下收回,二者完全无缝连接,那么这是怎么实 ...

  9. ios swift模仿qq登陆界面,xml布局

    给大家推荐两个学习的地址: 极客学院的视频:http://www.jikexueyuan.com/path/ios/ 一个博客:http://blog.csdn.net/lizhongfu2013/a ...

最新文章

  1. IIS APPPOOL\DefaultAppPool 登录失败的解决方法
  2. linux 挂载光盘映像,在 Windows Mac和Linux上,如何挂载iso和其他光盘映像
  3. Executors线程池关闭时间计算
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数
  5. linux的locate工具,linux文本查找工具之locate、find
  6. pytorch gather_GCN的简单实现(pytorch)
  7. 笔记本暗屏维修多少钱_电视机烧了维修多少钱?
  8. zookeeper学习(二)之java客户端API建立连接
  9. android插件化-apkplug中OSGI服务基本原理-08
  10. 乱码 讯飞 语音识别_科大讯飞离线语音识别安装与运行
  11. 高频信号发生器设计—电感三点式振荡电路
  12. 游戏一直被攻击掉线卡顿是什么原因?服务器被攻击怎么办?
  13. 《The Alchemist》阅读笔记
  14. 前端实现高效的海报系统
  15. 教你解包华为U8825D官方固件UPDATE.APP --以B956为例
  16. Discuz论坛怎么样防止被人恶意灌水
  17. js 月份间隔计算器_Moment.js 任务剩余时间计算器
  18. three.js之自定义一个正方体(网格)
  19. Cris 的 Python日记(一):基础语法
  20. 【艾思软件】微信小程序开发报价方案模版

热门文章

  1. PPT对齐的快捷键(添加到工具栏中)
  2. android播放资源音乐,android音乐播放器_专辑列表
  3. excel计算合并单元格数量
  4. 【FAQ】关于华为地图服务定位存在偏差的原因及解决办法
  5. 第2课 - Ranorex模块和测试操作
  6. 磁力开源项目和自己服务器,怎么拥有个人磁力 - leoay的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. python打印楼梯和笑脸_用Python的Turtle库打印楼梯,并打印笑脸:)
  8. 使用HttpClient模拟登陆并爬取网页
  9. kodi 开源播放器的编译移植
  10. 微信小程序video全屏分分享按钮