具体思路

  1. 通过UIKeyboardWillChangeFrameNotification通知,监听键盘的改变,同时可以得到键盘的Frame和动画的持续时间,
  2. 新建键盘顶部工具条YSComposeToolBar,默认在底部,Y值随着键盘的改变而改变,会一直显示在键盘的最上面,动画持续时间使用步骤一通知得到的时间
  3. 新建一个存放表情的YSEmoticonKeyboard(由YSEmoticonListView + YSEmoticonTabBar)整体View,替换掉原生的键盘。其中YSEmoticonListView指的是表情列表,YSEmoticonTabBar指的是表情类型,如:浪小花、默认表情、QQ表情等。
  4. YSEmoticonListView由UIScrollView+UIPageController 组成。UIScrollView存放着由YSEmoticonPageView装着很多表情(Button)的列表组成。
  5. 所有的界面控制操作,都封装在YSComposeViewController的控制器中里。

部分代码说明

1.键盘通知

打印一下键盘的UIKeyboardWillChangeFrameNotification通知,我们可以得到键盘的Frame和动画的持续时间。

{name = UIKeyboardWillChangeFrameNotification; userInfo = {UIKeyboardAnimationCurveUserInfoKey = 7;UIKeyboardAnimationDurationUserInfoKey = 0;UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 252}}";UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 441.5}";UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 442}";UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 315}, {320, 253}}";UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 316}, {320, 252}}";UIKeyboardIsLocalUserInfoKey = 1;
}}

键盘的Frame和动画的持续时间

    NSDictionary *userInfo = notification.userInfo;// 动画的持续时间double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];// 键盘的frameCGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

2.替换掉原来的键盘

self.textView.inputView == nil : 使用的是系统自带的键盘

self.textView.inputView = self.emoticonKeyboard; 指的是用表情view替换掉原来的键盘

懒加载一个View

#pragma mark - 懒加载
- (YSEmoticonKeyboard *)emoticonKeyboard
{if (!_emoticonKeyboard) {self.emoticonKeyboard = [[YSEmoticonKeyboard alloc] init];// 键盘的宽度self.emoticonKeyboard.width = self.view.width;self.emoticonKeyboard.height = 216;}return _emoticonKeyboard;
}

替换掉原来的键盘

/***  切换键盘*/
- (void)switchKeyboard
{// self.textView.inputView == nil : 使用的是系统自带的键盘if (self.textView.inputView == nil) { // 切换为自定义的表情键盘self.textView.inputView = self.emoticonKeyboard;// 显示键盘按钮self.toolbar.showKeyboardButton = YES;} else { // 切换为系统自带的键盘self.textView.inputView = nil;// 显示表情按钮self.toolbar.showKeyboardButton = NO;}// 开始切换键盘self.switchingKeybaord = YES;// 退出键盘
    [self.textView endEditing:YES];// 结束切换键盘self.switchingKeybaord = NO;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 弹出键盘
        [self.textView becomeFirstResponder];});
}

项目结构

1.YSComposeViewController :发微博Controller

YSComposeToolbar:键盘顶部的工具条

YSEmoticonKeyboard:表情键盘(整体): YSEmoticonListView + YSEmoticonTabBar

YSEmoticonListView:表情列表,由YSEmoticonPageView + 分页

YSEmonticonTabBar:表情底部TabBar,切换不同的表情

2.YSEmoticonListView结构,上面由一个YSEmoticonPageView,加载一页的列表,有多少页表情列表,就有多少个pageView。底部是一个分页控件UIPageControl。

源代码下载地址:https://github.com/jiangys/ChatKeyboard

iOS 聊天表情键盘相关推荐

  1. flutter聊天界面-自定义表情键盘实现

    flutter聊天界面-自定义表情键盘实现 flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iO ...

  2. ios 表情符号 键盘_iOS 表情键盘+gif聊天图文混排,看我的就够了

    更新: 1.解决首次加载键盘卡顿的问题: 2.修改聊天布局方式,现在无需计算,更加丝滑. 前言: 之前做过[OC版本]和[swift版本]图文混排和表情键盘,说实在的很low,特别是键盘,整体只是实现 ...

  3. swift 聊天表情emoji转译(一)——从键盘到输入框

    题记 做聊天框时,遇到了几个麻烦事,在此记录,以备自查,其他观者仅供参考.有更好的做法,也请赐教.​​​​​​​ 代码并不可直接复制使用.写博客时,添加了详细的注释,标明每段代码的用途. 正文 聊天输 ...

  4. iOS开发-------自定义简单的表情键盘(UICollectionView 集合视图)

    最近制作自制表情键盘的时候,突然了解到还有一个叫做UICollectionView (集合视图)的类,就研究了一下,确实在做表情键盘上要比用 UIScrollView(滚动视图) 要简单的多,用法与 ...

  5. ios 表情符号 键盘_iOS中表情键盘的完整实现方法详解

    前言 最近在公司做了个表情键盘的需求,这个需求的技术难度不会很大,比较偏向业务.但是要把用户体验做的好也是不容易的,其中有几个点需要特别注意.话不多说,下面开始正文(注:本文对应的Demo放在Gith ...

  6. IOS控件系列--优雅的表情键盘设计(扩展性好)

    本控件效果如下图所示: 本控件设计的几个原则 : 1.扩展性好,代码不冗余. 2.逻辑清晰. 3.回调接口清晰. 4.移植性好. 首先来讨论下本控件的扩展性: 效果图给出的是3行7列.如果这个行列因子 ...

  7. iOS 【快速集成QQ表情键盘】

    Demo演示: 如果是UITextView,导入#import "UITextView+YZEmotion.h" 如果是UITextField,导入#import "UI ...

  8. iOS_仿QQ表情键盘

    当UITextFiled和UITextView这种文本输入类控件成为第一响应者时,弹出的键盘由他们的一个UIView类的inputView属性来控制,当inputView为nil时会弹出系统的键盘,想 ...

  9. Swift3.0 功能二 (表情键盘与图文混排)

    随着iOS越来越多表情键盘以及图文混排的需求,本文运用Swift3.0系统的实现其功能以及封装调用方法,写的不好,如有错误望各位提出宝贵意见,多谢 项目源码地址: 相关知识点都有标识 项目源码地址 废 ...

最新文章

  1. 自动化监控--zabbix中的Macros(宏)详解
  2. php导出照片,TP5导出excel图片和数据--先下载图片到本地服务器
  3. 力扣:7整数反转(python)
  4. 用Eclipse进行C/C++开发
  5. 天池 在线编程 寻找比周围都大的点(模拟)
  6. 矩阵求逆c语言实现_[V-SLAM] Bundle Adjustment 实现
  7. java shapes_Java Overlaping Shapes – 错误的重叠形状行为
  8. activiti 解压zip java.lang.IllegalArgumentException: MALFORMED 错误
  9. 程序员生存定律--如何尽快变的稍微专业一点
  10. 微宝球型机器人功能_腾讯智能球型机器人专属app(微宝)
  11. 计算机四级 信息安全工程师——计算机网络题库
  12. remix os显卡linux,Remix OS 系统 PC版下载和评测 | Remix OS是什么系统_什么值得买
  13. 京东商品数据数据爬取
  14. pyTorch中tensor运算
  15. 微机原理与接口技术复习笔记(1)——微型计算机概述
  16. VS Code + phpstudy实现PHP环境配置
  17. 多智能体强化学习(三)单智能体强化学习
  18. iOS开发 字体的几种设置方法
  19. timesten支持mysql吗_TimesTen数据库初探
  20. 【图形学】04 数学部分(四、放射变换)

热门文章

  1. recyclerview简单使用
  2. Linux命令提示行设置--SP1
  3. 小班运用计算机教学活动,小班《小蚂蚁》活动教案精选
  4. python如何给某列数据打标签_Python map, apply, transform 打标签方法汇总(初阶到高阶)...
  5. AF_XDP socket 测试
  6. Windows 7 安装软件错误:“Error 1935 ...HRESULT: 0x800736FD” 的解决办法
  7. ROS turtlebot_follower :让机器人跟随我们移动
  8. 多源异构网络安全关联分析
  9. 微信公众号模板消息推送问题汇总
  10. STM32+HC-05蓝牙模块学习与使用