具体思路

  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 = ;
UIKeyboardAnimationDurationUserInfoKey = ;
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 = ;
}}

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

    NSDictionary *userInfo = notification.userInfo;
// 动画的持续时间
double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// 键盘的frame
CGRect 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 = ;
}
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. iOS开发之自定义表情键盘(组件封装与自动布局)

    下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自 ...

  2. iOS swift 关于自定义表情键盘

    目录 输入框 键盘监听 键盘切换 表情装载 表情加载 表情输入 表情输出 表情显示 结束语 demo下载 demo图片: 输入框 为了让输入框能够随着用户输入内容变化自动变化高度,这里的输入框使用UI ...

  3. ios开发之--仿(微信)自定义表情键盘

    先附上demo:https://github.com/hgl753951/CusEmoji.git 效果图如下:

  4. iOS_仿QQ表情键盘

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

  5. iOS Swift WisdomKeyboardKing 键盘智能管家SDK

    iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言:    今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...

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

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

  7. Xamarin的不归路-ios模拟器没有键盘

    ios模拟器没有键盘解决方案: 勾选上就有了. 2016年9月1日

  8. IOS Emoji表情

    IOS Emoji 前言:我比较喜欢有趣的东西,有一些有趣的小东西,可能不是多么多么牛逼,也可能不需要多高深的技巧,也不会为其他什么强大的功能而服务,但是有时候将很多有趣的小东西组合起来运用,比如在你 ...

  9. 表情键盘及文字表情识别简单demo

    1.前言 了解了简单图文混排 (属性字符串的使用)及 正则表达式的部分知识,为了加深印象,写了个简单表情键盘demo 展示文字用的是 UITextView 由于时间匆忙,存在一些bug,以及不完善的地 ...

随机推荐

  1. WordPlayer

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. [No0000132]正确使用密码加盐散列[译]

    如果你是一个 web 开发工程师,可能你已经建立了一个用户账户系统.一个用户账户系统最重要的部分是如何保护密码.用户账户数据库经常被黑,如果你的网站曾经被攻击过,你绝对必须做点什么来保护你的用户的密码 ...

  3. Maven Tomcat Plugin

    <!-- 本地Tomcat --> <dependency> <groupId>org.apache.tomcat.maven</groupId> &l ...

  4. nginx反向代理服务器获取不到端口的问题的解决办法

    使用nginx为反向代理服务器时,后端应用程序获取不到请求端口的解决办法. 以下是nginx 简单的配置 server {         listen       81;         serve ...

  5. c#如何调用另外一个项目的类

    添加引用即可. 参考资料: https://zhidao.baidu.com/question/241402877.html http://blog.csdn.net/a1027/article/de ...

  6. Only the storage referenced by ptr is modified. No other storage locations are accessed by the call.

    free - C++ Reference http://www.cplusplus.com/reference/cstdlib/free/ Data races Only the storage re ...

  7. json和pickle,XML

    什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言:JSON ...

  8. HTML中select的option设置selected="selected"无效的解决方案

    今天遇到了一个奇葩问题,写HTML时有个select控件,通过设置option的selected="selected"居然无效,但是在其他浏览器是可以的,问了一下Google大神, ...

  9. 20165336 2017-2018-2 《Java程序设计》第1周学习总结

    20165336 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java地位.特点:Java具有面向对象.与平台无关.安全.稳定和多线程等优良特性.Java ...

  10. 什么是cookie?cookie的使用(设置,读取,删除)

    1.什么是cookie?     页面用来保存信息            比如:自动登录,记住用户名     cookie的特性           同一个网站所有页面共用一套cookie       ...