前言

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

市面上的表情键盘的分析

首先来看一下市面上主要的几个APP上的表情键盘,平时使用的时候不会去关注细节,这次特意去使用了表情键盘,发现各个APP的体验还是有优有劣的。

首先是QQ和微信,这两者差不多,切换到表情键盘的时候都是没有光标的,这样的用户体验是非常不好的,没有办法在输入表情的时候框选区域,也不能拖动光标进行特定位置的复制黏贴删除等操作,微信甚至在输入框里显示的都不是点击的表情图片,而是文字描述。

微信QQ表情键盘.JPG

接下来看一下微博国际版,国际版调起表情键盘时是有光标的,是一个"真正的"键盘,但是想要拖拽光标的时候,很大概率上会触发到保存图片的行为(如下图所示),导致根本没办法拖动光标。

微博国际版误触.JPG

同时微博国际版输入框表情黏贴后的光标定位是错误的,如下图,开始时光标是在第4个表情后面,然后复制狗头+害羞两个表情黏贴到光标后,光标还是在第4个表情后,同时黏贴的表情前后都莫名多了空格。

微博国际版黏贴.JPG

最后是微博,微博客户端的表情键盘的体验是非常好的,上面说到的问题都不存在,而且表情键盘的删除按钮还能长按删除输入框的内容。

微博表情键盘.jpg

表情键盘的实现

实现效果

主要实现了以下几个功能

能输入表情,有光标,支持复制黏贴删除表情等

长按预览表情

删除表情、长按连续删除表情

适配 iPhone X

演示.GIF

基本思路

首先,表情包的图片是用bundle的形式组织的,用PPSticker类表征一套表情包,用PPEmoji类表征某一个表情,用一个plist作为配置文件,存储表情包的信息。

表情的组织.jpg

PPStickerDataManager类主要负责数据部分,用单例的形式,这样可以在初始化的时候只会读取一次plist文件中的所有表情信息;同时我们把输入框内容发到服务端以及从服务端请求到的都是纯文本的,比如会把 "笑死了

ios 表情符号 键盘_iOS中表情键盘的完整实现方法详解相关推荐

  1. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  2. object类中的equals与自定义equals方法详解

    object类中的equals与自定义equal方法详解 1.this怎么理解?this == obj表示什么? this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,ob ...

  3. php 修改 wordpress,修改WordPress中文章编辑器的样式的方法详解

    这篇文章主要介绍了修改WordPress中文章编辑器的样式的方法详解,同时文中也推荐了两款取代默认文章编辑器的插件,需要的朋友可以参考下 自定义文章编辑器的样式每一个 WordPress 主题的文章样 ...

  4. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  5. pythonbool类型数组生成_对numpy中布尔型数组的处理方法详解

    布尔数组的操作方式主要有两种,any用于查看数组中是否有True的值,而all则用于查看数组是否全都是True. 如果用于计算的时候,布尔量会被转换成1和0,True转换成1,False转换成0.通过 ...

  6. java n%9==0_用C++实现求N!中末尾0的个数的方法详解

    题目描述: 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为1行,n(1≤n≤1000) 输出描述: 输出一个整数 ...

  7. 站长在线Python精讲:在Python中匹配字符串的3个方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中匹配字符串的3个方法详解>.本知识点主要内容有:使用match()方法进行匹配.使用search()方法进行 ...

  8. 站长在线Python精讲:在Python中格式化字符串的两种方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...

  9. pdo mysql fetchall_PDO中获取结果集之fetchAll()方法详解

    fetchAll()方法是获取结果集中的所有行,返回一个包含结果集中所有行的二进制数组!大理石机械构件维修厂家 那么在上一篇<PDO中获取结果集之fetch()方法详解>中,我们介绍了fe ...

最新文章

  1. Tesseract-OCR 3.04简单使用举例(读入图像输出识别结果)
  2. 某企业生产系统升级Linux系统及内核
  3. 阿里巴巴公布第二财季报告,净利润同比增长71%
  4. POJ 2749 Building roads 2-sat+二分答案
  5. web记录文章浏览数_内网渗透 -- 获取内网浏览器历史记录等相关信息
  6. iOS点滴- ViewController详解
  7. UA MATH523A 实分析3 积分理论例题 证明函数列L1收敛的一个题目
  8. 数据结构 二叉树的遍历
  9. 在package-lock.json中指定node-mass版本+独立编译flink中的flink-runtime-web模块
  10. rgb颜色查询工具_Web前端页面重构之工具篇(Photoshop)
  11. java 连接hadoop集群_hadoop集群访问——Hadoop客户端访问、Java API访问
  12. 荣耀路由器外界硬盘与win10
  13. SD卡--摄像头中扩容卡原理及检测机制
  14. 认识计算机听课记录20篇,【中学信息技术听课记录】 信息技术听课记录15篇及评析_初中信息技术听课记录_高中信息技术听课记录20篇_东城教研...
  15. mysql设置59分59秒会自动加一秒
  16. TPshop项目介绍
  17. 【高并发】假如你网站一天有千万级访问量高并发,如何破解?
  18. 纯css实现手风琴效果_创建纯CSS手风琴的4种方法
  19. 微信小程序商城如何打印快递单
  20. STL源码剖析(十三)关联式容器之rb_tree

热门文章

  1. 从Java的前景与就业情况看,Java是你首选的编程语言,没有之一
  2. 微信小程序策划与运营
  3. Github每日精选(第5期):文档管理工具paperless-ngx和dzzoffice
  4. Spring---快速进行SSJ集成
  5. 进程间通信(一)(管道文件操作)
  6. Linux后端服务器网络编程之线程模型丨reactor模型详解
  7. SAP中内部订单清单功能
  8. The Pragmatic Programmer 转载
  9. win10 Opencv4.5.0源码编译支持CUDA加速
  10. 计算机短暂黑屏,为什么电脑会突然部分黑屏