iOS开发-聊天气泡的绘制和聊天消息列表

iOS开发中什么最重要?流媒体?即时通讯?还是其他什么技术?其实都不是,最重要的东西诚然只是iOS的基础,比如画一个按钮,封装一个控件,扩展一个类等等。这些东西看似简单,实则很难,所有的技术都基于这些最基础的东西,今天要说的是聊天气泡的绘制,和做一个简单的聊天列表:
这里绘制了三种聊天气泡:
1.自定义聊天气泡
在这里插入图片描述
绘制方法如下:

//右边气泡
#import "ChatBaseRight.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5
@implementation ChatBaseRight- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, k_radius, k_height);CGContextAddArcToPoint(context, 0, k_height, 0, k_height - k_radius, k_radius); //左下CGContextAddArcToPoint(context, 0, 0, k_radius, 0, k_radius); //左上CGContextAddArcToPoint(context, k_width - k_radius * 2, 0, k_width - k_radius * 2, k_radius, k_radius); //右上CGContextAddArcToPoint(context, k_width - k_radius * 2, k_height, k_width, k_height, k_radius * 2); //右下CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end
//左边气泡
#import "ChatBaseLeft.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5
@implementation ChatBaseLeft- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, 0, k_height);CGContextAddArcToPoint(context, k_radius * 2, k_height, k_radius * 2, k_height - k_radius * 2, k_radius * 2); //左下CGContextAddArcToPoint(context, k_radius * 2, 0, k_radius * 3, 0, k_radius); //左上CGContextAddArcToPoint(context, k_width, 0, k_width, k_radius, k_radius); //右上CGContextAddArcToPoint(context, k_width, k_height, k_width - k_radius, k_height, k_radius); //右下CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end

2.仿微信聊天气泡
在这里插入图片描述
绘制方法如下:

//右边气派
#import "ChatWXRight.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5@implementation ChatWXRight- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, 4, k_height);CGContextAddArcToPoint(context, 0, k_height, 0, k_height - k_radius, k_radius); //左下CGContextAddArcToPoint(context, 0, 0, k_radius, 0, k_radius); //左上CGContextAddArcToPoint(context, k_width - k_radius, 0, k_width - k_radius, k_radius, k_radius); //右上CGContextAddLineToPoint(context, k_width - k_radius, 15);CGContextAddLineToPoint(context, k_width, 20);CGContextAddLineToPoint(context, k_width - k_radius, 25);CGContextAddArcToPoint(context, k_width - k_radius, k_height, k_width - k_radius * 2, k_height, k_radius); //右下CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end
//左边气泡
#import "ChatWXLeft.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5@implementation ChatWXLeft- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, k_radius * 2, k_height);CGContextAddArcToPoint(context, k_radius, k_height, k_radius, k_height - k_radius, k_radius); //左下CGContextAddLineToPoint(context, k_radius, 25);CGContextAddLineToPoint(context, 0, 20);CGContextAddLineToPoint(context, k_radius, 15);CGContextAddArcToPoint(context, k_radius, 0, k_radius * 2, 0, k_radius); //左上CGContextAddArcToPoint(context, k_width, 0, k_width, k_radius, k_radius); //右上CGContextAddArcToPoint(context, k_width, k_height, k_width - k_radius, k_height, k_radius); //右下CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end

3.因为上面绘制的两种气泡都存在问题,就是容易被拉伸,导致那个小尾巴变形,所以把小尾巴和气泡分开画。
绘制气泡:

#import "ChartCommon.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5@implementation ChartCommon- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, 4, k_height);CGContextAddArcToPoint(context, 0, k_height, 0, k_height - k_radius, k_radius); //左下CGContextAddArcToPoint(context, 0, 0, k_radius, 0, k_radius); //左上CGContextAddArcToPoint(context, k_width, 0, k_width, k_radius, k_radius); //右上CGContextAddArcToPoint(context, k_width, k_height, k_width - k_radius, k_height, k_radius); //右下CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end

绘制气泡小尾巴:

//左边小尾巴
#import "ChatTailLeft.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5@implementation ChatTailLeft- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, k_width, k_height / 2 - k_radius);CGContextAddLineToPoint(context, 0, k_height / 2);CGContextAddLineToPoint(context, k_width, k_height / 2 + k_radius);CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end//右边小尾巴
#import "ChatTailRight.h"#define k_width self.bounds.size.width
#define k_height self.bounds.size.height
#define k_radius 5@implementation ChatTailRight- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.64f green:0.90f blue:0.39f alpha:1.00f].CGColor);CGContextMoveToPoint(context, 0, k_height / 2 - k_radius);CGContextAddLineToPoint(context, k_width, k_height / 2);CGContextAddLineToPoint(context, 0, k_height / 2 + k_radius);CGContextClosePath(context);CGContextDrawPath(context, kCGPathFill);
}@end

这是三种聊天气泡,然后有人说为什么不用图片?对,图片可以拉伸指定区域来避免失真是个好方法,不过这里我们说的是基础嘛,自己画着玩。从性能角度讲,虽然图片简单,但是图片太多会耗费大量的内存,不过这种情况应该不会出现,都是重用的,为什么要绘制呢?绘制出来的东西也是重用的,很多地方我们为了增加流畅度都会采用绘制的方式来提高性能,避免离屏渲染,所以性能方面博主没做比较,但鹿死谁手还未可知,如果要用就用第三种方法来处理。

想要学习的可以查看博主Demo,下载地址:点击前往下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt模仿QQ聊天窗口界面(一)

Qt模仿QQ聊天窗口界面(一) Qt模仿QQ聊天窗口界面(一) 简述效果图 QQ的聊天窗口我做的效果图 代码篇 结尾 简述 最近利用业余时间,模仿QQ做了一个聊天窗口界面,功能还不全,准备分几个部分做出…

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

以下是YYKit组件的源码分析,高级性能优化相关都在里面可以找到 YYwebImage超细源码分析YYImage超细源码分析YYModel源码分析YYText源码分析 12.27日更新:分析了一个很牛B的聊天UI框架 进阶版高级UI实现 帅气的我又来了,是不是帅气逼人。。。…

QT 登录界面 主界面 切换 仿TIM

QT 登录界面 主界面 切换 一 环境搭建 平台是vs2012 Qt5.2.1 属于QWidget窗口 在项目里又添加了QMainwindow窗口 二 编写代码 QWidget的窗口名是loginwindow,QMainwindow的窗口名是mainwidow(发现window少打一个n 尴尬) loginw…

环信聊天列表不刷新数据

还原问题: 如图主Ui是activity,下侧的围观区是Fragment,根据环信的demo,上面聊天区可以正常刷新UI。 但是围观区数据源变化,但是不能刷新UI。 思路: 研究一个下午,理了好久逻辑。发现我的问题是&#x…

环信实现聊天功能

目录 1、即时通信1.1 什么是即时通信?1.2 功能说明 2 技术方案3 环信3.1 开发简介3.2 环信Console 4 用户体系集成4.1 Appkey 数据结构4.2 环信 ID 数据结构4.3 环信 ID 使用规则4.4 获取管理员权限4.4.1 配置4.4.2 获取token4.5 注册环信用户4.6 测试4.7 查询环信用…

Android泡泡聊天界面的实现

昨天写了个界面,实现了Android泡泡聊天界面。运行结果如下,点击发送按钮,屏幕就显示Text的内容。 我也是在网上的一份源码的基础上更改的,整个泡泡界面的实现要点: (1)主界面其实就是一个List V…

【开源免费】使用Spring Boot和Html实现ChatGPT,1:亿还原,将就看。

简介 关注我:GPT4.0 JAVA SDK近期更新 前段时间写了一个Chatgpt的Java版SDK开源地址:chatgpt-java欢迎使用。但由于原来OpenAI 并没有支持官网的chatgpt模型,所以使用起来相对没有官网那么智能完善,所以就没有写出一个demo项目&a…

Fdog系列(五):使用Qt模仿QQ实现登录界面到主界面,功能篇。

文章目录 一. 前言同时完整项目代码已上传github:[Fdog即时通讯软件](https://github.com/HuaGouFdog/FdogInstantMessaging) 求星星!二. 正文1. 如何保存第一次登录数据2. 如何获取已经登录过的账号信息,并完成自定义下列框3. 从下拉列表框删除账号4. 文…

可换皮肤的Qt登录界面

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ 可换皮肤的Qt登录界面 QSS的学习笔记 快…

chatgpt赋能python:Python如何去除停用词

Python 如何去除停用词 介绍 在进行自然语言处理时,停用词是常见的障碍。停用词是指在文本中频繁出现但没有实际意义的词语。例如,“the”、“is”、“a” 等单词通常被认为是停用词,因为它们在具有意义的文本中出现得非常频繁,…

使用关联规则分析股票数据--数据来自tushare大数据社区

使用关联规则分析股票数据--数据来自tushare大数据社区 一、开发环境二、目标三、关联规则(之前了解过直接跳到第四步)1.关联规则的定义2.啤酒尿布的例子2.1 支持度2.2置信度2.3 提升度2.4 关联规则2.5 啤酒和尿布 四、股票关联规则分析1.使用的库2.获取…

Twitter部分源代码泄漏、疑遭离职员工报复:马斯克要求GitHub交出所有上传、下载人员名单...

点击“开发者技术前线”,选择“星标” 让一部分开发者看到未来 作者 | Tina 来自:AI前线 最近的法律文件显示,Twitter 的部分源代码已经在网上泄露。这是一次罕见的、严重的知识产权泄露事件。为防止该事件对其服务产生潜在的破坏…

马斯克刚说要开源,没几天Twitter源代码就泄漏了...

出品 | OSC开源社区(ID:oschina2013) 根据《纽约时报》的报道,一份法律文件显示,Twitter 称其部分源代码在网上被泄露,该公司已于上周五采取行动,它通过向托管代码的 GitHub 发送版权侵权通知,删…

文心一言员工跳槽工资翻倍, AI 人才备受追捧;推特称其部分源代码遭泄露;Docker 撤回受争议的收费方案|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

有道智云翻译API + retrofit实现在线翻译Android app

目录 1.进入有道智云主页,注册自己的账号(手机号验证码),完善信息随意填 2.登录进来后,创建应用。根据需要选择语言翻译服务。 3. 打开Android Studio,新建空的Activity项目 1. 新建项目,在build.gradle(app)添加re…

STRAIGHT声码器详解

转载请注明出处。 STRAIGHT自适应加权谱内插的语音转换与重构 STRAIGHT( Speech Transformation and Representation using Adaptive Interpolation of weighted spectrum)算法(Kawahara,1998),是一种语音信号分析、合成、修改的…

chatgpt赋能python:如何用Python挣钱:从小白到大佬的必备指南

如何用Python挣钱:从小白到大佬的必备指南 作为一名有10年Python编程经验的工程师,我深知Python的应用范围非常广泛,它可以为各种行业带来巨大的价值。当然,对于许多人来说,如果你是一名SEO从业者,也完全可…

chatgpt赋能python:如何利用Python在网上赚钱:一份SEO指南

如何利用Python在网上赚钱:一份SEO指南 随着互联网的快速发展和Python成为一种越来越受欢迎的编程语言,越来越多的人开始利用Python在网上赚取额外的收入。本篇文章将介绍一些Python工具和技术,以及SEO最佳实践,帮助你利用Python…

PHP短信验证功能

PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定AppKEY和App Secret还有配置签名 第二步 在应用管理中选择SDK下载,或者直接点击http://download.csdn.net/detail/s371795639/9695983下载,免费的…

发送短信验证码 API数据接口

1.前言 此接口发送短信验证码 短信模板 参数说明: 1449978 验证码为:{1}为您的登录验证码,请于{2}分钟内填写,如非本人操作,请忽略本短信。 1449979 验证码为:{1},您正在登录,若非本人操作&…