步骤:发微博12-表情键盘06-点击表情 -> 发微博13-表情键盘07-插入表情和封装textView -> 发微博14-表情键盘08-长按表情 -> 发微博15-表情键盘09-最近表情 -> 发微博16-表情键盘10-最近表情完善

发微博12-表情键盘06-点击表情

APP的演示动画:

分析:当触发表情按钮的点击事件时,会出现相应表情的放大镜。

在HMPageEmotionView(scrollView上每一页上的表情内容)类的setEmotion:方法中,监听表情按钮点击,如下:

其中,btnClick:方法如下:

说明:

  1. HMEmotionButton封装了表情按钮的细节,一个HMEmotionButton对应一个HMEmotion。如下:

2.HMEmotionPopView封装了表情按钮的放大镜的细节,并且懒加载。如下:

3.由于放大镜界面固定,所以采用xib加载。如下:

补充:instancetype表明返回类型与调用该类方法的对象类型相同。

发微博13-表情键盘07-插入表情和封装textView

APP的演示动画:

分析:当点击表情按钮时,会发出通知,将表情数据传递给composeViewController的textView上,点击右下角的删除按钮可以删除已经插入的表情或文字。

在HMPageEmotionView中,完善btnClick:方法,延迟0.2s让popView自动消失,并且发出通知给composeViewController的textView是哪个按钮响应了点击事件。如下:

说明:由composeViewController的textView监听该通知,如下:

其中,emotionDidSelect:方法,具体代码如下:

在emotionDidSelect:方法中调用的insertEmotion:方法是HMEmotionTextView(继承自HMTextView)对插入表情细节的封装,如下:

其中insertAttributedText:方法是基于UITextView的category(扩展),如下:

在HMPageEmotionView中的initWithFrame:方法初始化删除按钮,如果没有设置删除按钮的frame,删除按钮会在pageView的subviews的第一个,截图如下:

为了解决这种情况,需要完善layoutSubviews:方法,让遍历subviews从1开始,如下:

参照表情选中的通知,要实现删除按钮的功能,也要发出通知,如下:

UITextView遵守的UIKeyInput协议上有一个很实用的方法,用于删除文字,如下:

发微博14-表情键盘08-长按表情

APP的演示动画:

分析:在整个pageView上添加长按手势监听功能,只要手指长按表情按钮,表情按钮就会显示相应的放大镜。

在HMPageViewController的initWithFrame:方法中,添加长按手势,如下:

其中,longPressPageView:方法,具体代码如下:

说明:
1.通过手指位置找对应的表情按钮的emotionButtonWith:方法如下:

2.showFrom:方法是HMEmotionPopView类中对显示popView详细代码的封装,同时改进了之前HMEmotionPopView类中的代码,删除了之前的emotion属性,如下:

3.完善btnClick:方法,如下:

发微博15-表情键盘09-最近表情

APP的演示动画:

分析:点击表情按钮,除了会发出通知,还会存储表情数据到沙盒中(归档),然后在”最近“上加载沙盒中的表情数据(ps:懒加载和”最近“按钮的点击事件都要加载沙盒中的表情数据,保证每次到”最近“界面能及时更新表情数据)。

参照账号登陆工具类,表情数据也要新建一个工具类,如下:

在HMPageEmotionView的selectEmotion:方法中,将表情数据存储到沙盒里,如下:

在HMEmotionKeyboard类的recentEmotionView懒加载和HMEmotionTabBarDeleage代理方法中的”最近“都要加载沙盒里的表情数据,如下:

注意:
为了保证切换到”最近“时,表情数据能及时并且以正确的位置显示出来,需要对HMEmotionListView的setEmotion:方法进行完善,如下:

发微博16-表情键盘10-最近表情完善

仔细观察之前的”最近“,相同的表情会重复出现,明显不符合常理。所有对其进行改进。

APP的演示动画:

分析:”最近“上相同的表情不会重复出现,并且被点击的表情会自动排在最前面。

在前文中,有两处地方加载了沙盒子的表情数据,意味着有两个表情数组,实际上只需要一个表情数组即可,所以对表情工具类进行改进,如下:

说明:
1.删除重复的表情,系统方法removeObject只能删除同一个内存地址的模型,不能满足要求。我们要删除的是内存地址不同的表情模型但是模型里的数据却相同。为此,可以在HMEmotion类重写isEqual方法,如下:

2.归档解档需要HMEmotion表情模型遵守NSCoding协议,并实现initWithCoder:
和encodeWithCoder:方法,如下:

更轻松的解决方法是导入MJExtension框架,实现MJCodingImplementation即可,如下:

3.加载沙盒中的表情数据,返回一个表情数组的方法现在只需要在懒加载中即可,如下:

4.在”最近“中,点击表情,会即时更新”最近“上的表情数据,这是因为选中表情发出了通知,触发了加载表情数组的方法。如下:

学习HM微博项目第10天相关推荐

  1. 学习HM微博项目第1天

    步骤:搭建基本环境 -> 展示子控制器 -> 项目分层 -> 增加导航功能 -> 增加导航栏按钮. 搭建基本环境 该项目使用代码搭建UI界面,所以在HMAppDelegate的 ...

  2. 学习HM微博项目第9天

    步骤:发微博07-表情键盘01-切换键盘 -> 发微博08-表情键盘02-表情工具条 -> 发微博09-表情键盘03-加载表情数据和切换表情按钮 -> 发微博10-表情键盘04-表情 ...

  3. 学习HM微博项目第2天

    步骤:导航栏主题 -> 添加搜索框 -> 易混淆的属性 -> 自定义搜索框 -> 标题按钮 -> 弹出下拉菜单 -> 封装下拉菜单 导航栏主题 在HMNavigat ...

  4. 学习HM微博项目第8天

    步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和发送微博按钮 -> 发微博04-显示工具条 -> 发微博05-封 ...

  5. 学习HM微博项目第7天

    步骤:首页14-时间 -> 首页15-来源 -> 首页16-配图相册 -> 首页17-头像 首页14-时间 通过新浪官方的APP可知,在微博发送时间上是这么分类的: /**1.今年1 ...

  6. 【AI初识境】给深度学习新手开始项目时的10条建议

    这是专栏<AI初识境>的第12篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 在成为合格的深度学习算法工程师,尤其是工业界能够实战的调参选手之前,总会踏足很多的坑. 今 ...

  7. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  8. 后盾vip php框架,后盾网实战VIP教程之ThinkPHP微博项目系列培训

    php教程 当前位置:主页 > php教程 > 后盾网实战VIP教程之ThinkPHP微博项目系列培训 后盾网实战VIP教程之ThinkPHP微博项目系列培训 教程大小:1.56GB   ...

  9. 7月Python和机器学习最佳开源项目Top 10!

    [导读]七月就要结束了,在即将到来的 7 月最后一个周末,人工智能头条为大家整理了本月 ML 和 Python 最受欢迎的十大开源项目.就算放假在家也可以知道大家现在都在学些什么,学习放假两不误.这个 ...

最新文章

  1. 创业公司技术总监,去上市公司面试,结果凉了!
  2. boost::overwrite相关的测试程序
  3. linux 测试程序性能,推荐一款Linux系统的性能测试软件
  4. Java:放心(或非常容易)
  5. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...
  6. [转载] Python——摄氏温度转换华氏温度
  7. c语言中sprintf函数_在C / C ++中使用sprintf()函数
  8. 拓端tecdat|R语言计量经济学与有时间序列模式的机器学习预测
  9. 达观数据助力浙江大华构建企业级知识搜索共享平台,盘活沉淀数据
  10. python中def main是什么意思_python - 为什么要使用def main()?
  11. 在网页中加入“加载中提示”的方法
  12. html网页框架分割三部分,Dreamweaver用框架建立网站把浏览器的显示空间分割为几个部分...
  13. python怎么更新sp2_GitHub - Sp2-Hybrid/Python-100-Days: Python - 100天从新手到大师
  14. 计算机机械硬盘寿命,机械硬盘的寿命
  15. RN新架构 JSI 介绍
  16. 微信小程序 获取组件数据
  17. 如何编写一个简单的 Python 程序
  18. 恢复系统自带的office软件
  19. 咖说丨2020上半年DeFi行业研究报告
  20. 对字符串进行一个顺序排列

热门文章

  1. 学习:数学----欧拉定理与扩展欧拉定理
  2. 工业互联 智造未来 “2018 智造中国峰会•上海松江” 在上海市松江区隆重召开
  3. [高通SDM450][Android 9.0] 虹软人脸算法WIFI信息变化导致授权失败
  4. 《Adobe Photoshop CS6中文版经典教程(彩色版)》—第2课2.7节使用海绵工具调整饱和度...
  5. 难受的这两天,你们怎么样?
  6. 关于c3p0报错:An attempt by a client to checkout a Connection has timed out
  7. python连接teradata_使用Teradata模块将Python与Teradata连接
  8. 免费的在线MP4视频转gif工具,不注册不登录不花钱不安装
  9. 【论文阅读笔记】A Multi-Task Learning Formulation for Predicting Disease Progression
  10. 每日记录 8.28 TP(真阳率) NP(假阳率) FP