2015-09-04 by 木易哥哥 

做一个表情控件视图实现的思路主要是,UIScrollView装上表情的自定义view,表情view对应配置的表情库显示。

写了3个对象,EmotionScrollView,EmotionView,emoticons.plist,相关的主要代码是:

EmotionScrollView.h

#import <UIKit/UIKit.h>

#import "EmotionView.h"

@interface EmotionScrollView : UIView<UIScrollViewDelegate>{

UIScrollView     *scrollView;

EmotionView      *emotionView;

UIPageControl    *pageControl;

}

-(void)getSelectBlock:(SelectBlock)block;

-(void)deleteBtnPressBlock:(deleteBtnPress)block;

-(void)sendBtnPressBlock:(sendBtnPress)block;

@end

EmotionScrollView.m

#import "EmotionScrollView.h"

@implementation EmotionScrollView

-(id)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];

if (self) {

[self initViews];

}

return self;

}

-(void)getSelectBlock:(SelectBlock)block{

if (self != nil) {

emotionView.block = block;

}

}

-(void)deleteBtnPressBlock:(deleteBtnPress)block

{

if (self != nil) {

emotionView.deleteBtnPressBlock = block;

}

}

-(void)sendBtnPressBlock:(sendBtnPress)block

{

if (self != nil) {

emotionView.sendBtnPressBlock = block;

}

}

- (void)initViews{

emotionView  = [[EmotionView alloc]initWithFrame:CGRectMake(0, 0, 320*4,253)];

scrollView   = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 253)];

//NSLog(@"emotionView.height:%f",emotionView.height);

scrollView.backgroundColor = [UIColor whiteColor];

scrollView.contentSize = CGSizeMake(emotionView.width, 0);

scrollView.alwaysBounceVertical = NO;

scrollView.pagingEnabled = YES;

scrollView.showsHorizontalScrollIndicator = NO;

scrollView.clipsToBounds = NO;

scrollView.delegate = self;

[scrollView addSubview:emotionView];

[self addSubview:scrollView];

pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(140, 220, 40, 20)];//

pageControl.backgroundColor = [UIColor clearColor];

pageControl.numberOfPages   = emotionView.pageNumber;

pageControl.pageIndicatorTintColor = [UIColor grayColor];

pageControl.currentPageIndicatorTintColor = [UIColor blackColor];

pageControl.currentPage     = 0;

[self addSubview:pageControl];

}

- (void)drawRect:(CGRect)rect {

//[[UIImage imageNamed:@"emoticon_keyboard_background.png"]drawInRect:rect];

}

#pragma  mark  - UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)_scrollView{

int pageNumber = _scrollView.contentOffset.x/SCREEN_WIDTH;

pageControl.currentPage = pageNumber;

}

@end

EmotionView.h

#import <UIKit/UIKit.h>

#import "SvGifView.h"

typedef void(^SelectBlock)(NSString *emotionName);

typedef void(^deleteBtnPress)();

typedef void(^sendBtnPress)();

@interface EmotionView : UIView{

@private

NSMutableArray *items;

UIImageView    *magnifierView;

SvGifView       *_gifView;

}

@property(nonatomic,copy)NSString     *selectedEmotion;

@property(nonatomic,assign)NSInteger  pageNumber;

@property(nonatomic,copy)SelectBlock  block;

@property(copy,nonatomic)deleteBtnPress deleteBtnPressBlock;

@property(copy,nonatomic)sendBtnPress sendBtnPressBlock;

@property(nonatomic,assign)float  width;

@property(nonatomic,assign)float  height;

@end

EmotionView.m

-(void)initData{

items = [[NSMutableArray alloc]init];

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"emoticons" ofType:@"plist"]; //"emoticons.plist"是个数组

NSArray *fileArray = [NSArray arrayWithContentsOfFile:filePath]; //目前这个fileArray有没有分类的104个表情,现在我们需要把它分类成上面注释中items的形式

//NSLog(@"fileArray:%@",fileArray);

//----------整理表情,整理成一个二维数组----------

NSMutableArray *item2D = nil;

for (int i=0; i < fileArray.count; i++) {

NSDictionary *item = [fileArray objectAtIndex:i];

if (i % 28 == 0) {

item2D  = [NSMutableArray arrayWithCapacity:28];

[items addObject:item2D];

}

[item2D addObject:item];

}

//----------设置尺寸---------------

self.width  =  items.count *SCREEN_WIDTH;

self.height =  4 * item_height;

}

//画图

- (void)drawRect:(CGRect)rect {

int row = 0,colum = 0;  //定义行、列

for (int i = 0; i < items.count; i++) {

NSArray *items2D = [items objectAtIndex:i];

for (int j = 0; j < items2D.count+1; j++) {

CGRect   emotionFrame   = CGRectMake(colum*item_width + 15, row*item_height +15, 20, 20);

//考虑页数,需要加上前面一页的宽度

float x = (i*SCREEN_WIDTH) + emotionFrame.origin.x;

emotionFrame.origin.x = x;

if (j < items2D.count)//为了增加删除发送按钮

{

NSDictionary *item = [items2D objectAtIndex:j];

//[emotionImage drawInRect:emotionFrame];

//load gif picture begin

NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:[item objectForKey:@"cht"] withExtension:@"gif"];

_gifView = [[SvGifView alloc] initWithCenter:emotionFrame fileURL:fileUrl];

//NSLog(@"fileUrl:%@",fileUrl);

_gifView.backgroundColor = [UIColor clearColor];

_gifView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

[self addSubview:_gifView];

[_gifView startGif];

//load gif picture end

//更新列、行

colum ++;

if (colum % 7 == 0) {

row ++;

colum = 0;

}

if (row % 4 == 0) {

row = 0;

}

}

else{

//删除按钮

UIButton *deleteButton = [[UIButton alloc] initWithFrame:CGRectMake(emotionFrame.origin.x+item_width*5-10, emotionFrame.origin.y+item_height*4-5, 40, 29)];

[deleteButton setImage:[UIImage imageNamed:@"faceDelete"] forState:0];

[deleteButton addTarget:self action:@selector(deleteButtonPress:) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:deleteButton];

//发送按钮

UIButton *sendButton = [[UIButton alloc] initWithFrame:CGRectMake(emotionFrame.origin.x+item_width*6-5, emotionFrame.origin.y+item_height*4, 30, 20)];

[sendButton setBackgroundImage:[UIImage imageNamed:@"blueLongBtn"] forState:0];

sendButton.titleLabel.font = [UIFont systemFontOfSize:13];

[sendButton setTitle:@"发送" forState:0];

[sendButton addTarget:self action:@selector(sendButtonPress:) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:sendButton];

}

}

}

}

- (void)deleteButtonPress:(id)sender

{

if (self.deleteBtnPressBlock != nil) {

self.deleteBtnPressBlock();

}

}

- (void)sendButtonPress:(id)sender

{

if (self.sendBtnPressBlock != nil) {

self.sendBtnPressBlock();

}

}

emoticons.plist的配置如图

最后调试效果如图

iOS 动态表情控件视图的实现相关推荐

  1. iOS自定义View 控件自动计算size能力

    iOS自定义View 控件自动计算size能力 背景 在使用 UILabel 和 UIImage 的时候,不用指定宽高约束,控件也不会报约束缺失,还可以根据内容自己确定适合的宽高,特别适合 Xib 和 ...

  2. 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)

    前言:以前曾写过一篇关于动态生成控件的文章<动态添加控件及将某XML动态加入到Activity显示>,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合 ...

  3. Android 动态创建控件并设置控件的大小之Android屏幕适配攻略(五)

    Android 屏幕适配攻略(五)动态创建控件并设置控件的大小 题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 flutter中网络请求dio使用分析 视频 ...

  4. asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性

    asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false;  // true 因为这样该容器及其子控件会彻底的从页面上消 ...

  5. asp.net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  6. 在.NET上如何根据字符串动态创建控件

    在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称 ...

  7. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  8. pyqt5动态删除控件问题

    pyqt5 用的滚动条,表格布局,里面动态添加控件可以 但是动态删除,隐藏控件,第一次没反应,只有别的按钮点过后,这个才起作用.原因是因为: 调用了一个点击事件:self.dir_btns[0].cl ...

  9. 动态添加控件及将某XML动态加入到Activity显示

    一.动态添加控件.设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的 ...

最新文章

  1. 剑指offer_第10题_矩形覆盖
  2. Delphi的彩蛋 (好像Delphi5~Delphi7都可以)
  3. 玩转springboot:thymeleaf模板引擎入门程序
  4. 一篇文章弄懂Java反射基础和反射的应用场景
  5. Sqlserver存储过程和C#分页类简化你的代码!
  6. linux 隐藏显示终端光标
  7. mysql查询触发器_mysql查看所有触发器以及存储过程等操作集合【转】
  8. 物联网平台之争 巨头竞合并存
  9. Structure from Motion综述
  10. matlab进阶摸索篇——彩色图直方图均衡化
  11. 基于simulink的微电网虚拟同步发电机vsg控制系统仿真
  12. 千姿百态项目经理2——“缥缈”项目经理
  13. 从mitt、tiny-emitter源码中学习手写订阅发布
  14. 介绍中国传统节日的网页html,介绍中国传统节日的作文4篇
  15. 阿里云 IOT 物联网平台简单使用【随笔】
  16. IMP-00058: IMP-00000: 未成功终止导入
  17. matlab win32错误,尝试运行Matlab-Compiler-Runtime应用程序时Windows 7中出现SxS错误
  18. 中建五局电子合同:打通全业务数字化链路
  19. 培养你的逻辑思维能力
  20. 电视盒子 android tv6,ipad tv6电视棒使用方法图文教程

热门文章

  1. python 开发浏览器插件,利用firebreath开发跨浏览器插件
  2. 同等学力申硕 计算机科学与技术
  3. GPU编程的学习之路(1)
  4. Redis-什么是缓存雪崩、缓存击穿、缓存穿透
  5. 测试音质好坏的软件,敢挑战吗? 测测你是否真能听出好音质
  6. 【python】使用python将多个视频合并、延长视频的时间
  7. python将四通道图片转为三通道图片
  8. 王者该服务器未获取角色信息,王者荣耀体验服现实未获取角色信息 | 手游网游页游攻略大全...
  9. [class]与[class=]
  10. linux磁盘分区表 清理,linux 磁盘分区表