首页 > 其他分享 >iOS开发-聊天气泡的绘制和聊天消息列表

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

时间:2023-04-12 13:00:52浏览次数:54  
标签:iOS CGContextAddArcToPoint height width radius 聊天 context define 气泡


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

这里绘制了三种聊天气泡:

1.自定义聊天气泡

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


绘制方法如下:

//右边气泡
#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.仿微信聊天气泡

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


绘制方法如下:

//右边气派
#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,下载地址:点击前往下载


标签:iOS,CGContextAddArcToPoint,height,width,radius,聊天,context,define,气泡
From: https://blog.51cto.com/u_15993027/6185500

相关文章

  • 开源在线客服系统-客服系统历史消息记录功能-点击加载历史聊天记录-分页展示历史消息
    之前开发的开源在线客服系统gofly,访客端一直没有展示历史聊天记录,最近抽时间给加上了实现的效果就是,访客刚进聊天界面,如果存在历史记录,按5条分页,默认查询加载5条聊天记录。如果历史记录超过5条,顶部出现“点击加载更多”按钮,点击按钮就分页查询历史记录,堆入消息记录数组里。 ......
  • Axios异步框架
    Axios快速入门1.引入axios的js文件<scriptsrc="js/axios-0.18.0.js"></script>2.使用axio发送请求,并响应结果get:axios({method:"get",url:"http://localhost:8080/science/axiosServlet?username=zhangsan"}).then(function(resp){......
  • 在线客服系统搜索访客功能-通过访客名称、访客VisitorId、访客IP地址、聊天消息来进行
    在使用客服系统的时候,访客数量一旦多了起来,想要找到某一个访客是很困难的,很多时候我们需要快速定位到某一个访客,这里就需要用到搜索访客的功能了。 唯一客服系统的访客搜索功能1.访客名称搜索功能,如果我们对接了自己系统的访客名称,那么我们直接输入名称就能找到该访客了。但......
  • Chrome模拟手机浏览器(iOS/Android)的方法
    1、在chrome的开发者工具模式下,点击左上角的手机图标切换成手机模式(或者F12然后Ctrl+Shift+M),一般这个方法访问绝大多数设限的网站。2、第一种方法不行,则安装Google插件User-AgentSwitcherforGoogleChrome3、https://blog.csdn.net/gb4215287/article/details/64438603......
  • Axios是什么?Axios的名字的由来?
    axios是什么?他的名字的由来?Axios是一个基于Promise的HTTP客户端,可以用于浏览器和Node.js环境。它有助于发出XMLHttpRequests(发出HTTP请求),可以处理跨域请求。 Axios的名字来源于希腊神话中的英雄Axios,他是一个勇敢的冒险家,有着强大的力量和知识,他可以改变任何事物,使它们更加强大......
  • 2023年最新iOS打包发布流程汇总
     ​苹果开发者中心已经给出了很详细的说明,可以帮助开发者将iOS应用发布到AppStore。对于使用ReactNative开发的iOS应用来说,发布流程和普通的iOS应用大致相同,主要包括以下几个步骤:加入苹果开发者计划、生成和配置开发者证书、打包iOS应用以及上传应用并发布到A......
  • JetBrains AppCode 2023.1 (macOS x64、aarch64) - 适用于 iOS/macOS 开发的智能 IDE
    Xcode14.3compatibility,Swiftrefactoringsandintentions,theIDE’sUI,andKotlinMultiplatformMobile.请访问原文链接:https://sysin.org/blog/jb-appcode-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsAppCode-适用于iOS/macOS开发......
  • iOS上架错误:缺少出口合规证明
      版本构建完成后,发现提示:缺少出口证明,解决方法,如下:如果您的构建版本未使用加密,请在Info.plist文件中使用键字符串值,这样无需为下一构建版本提供出口合规证明信息。<key>ITSAppUsesNonExemptEncryption</key><false/>显示为 AppUsesNon-ExemptEncryption    ......
  • iOS面试
    1、你使用过Objective-C的运行时编程(RuntimeProgramming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗? Objecitve-C的重要特性是Runtime(运行时),在#import<objc/runtime.h>下能看到相关的方法,用过objc_getClass()和class_copyMethodList......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能聊天机器人从0到1快速入门——官网推荐的
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......