iOS 动态表情控件视图的实现
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
#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 动态表情控件视图的实现相关推荐
- iOS自定义View 控件自动计算size能力
iOS自定义View 控件自动计算size能力 背景 在使用 UILabel 和 UIImage 的时候,不用指定宽高约束,控件也不会报约束缺失,还可以根据内容自己确定适合的宽高,特别适合 Xib 和 ...
- 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)
前言:以前曾写过一篇关于动态生成控件的文章<动态添加控件及将某XML动态加入到Activity显示>,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合 ...
- Android 动态创建控件并设置控件的大小之Android屏幕适配攻略(五)
Android 屏幕适配攻略(五)动态创建控件并设置控件的大小 题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 flutter中网络请求dio使用分析 视频 ...
- asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性
asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false; // true 因为这样该容器及其子控件会彻底的从页面上消 ...
- asp.net动态添加控件学习
看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...
- 在.NET上如何根据字符串动态创建控件
在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称 ...
- android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值
http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...
- pyqt5动态删除控件问题
pyqt5 用的滚动条,表格布局,里面动态添加控件可以 但是动态删除,隐藏控件,第一次没反应,只有别的按钮点过后,这个才起作用.原因是因为: 调用了一个点击事件:self.dir_btns[0].cl ...
- 动态添加控件及将某XML动态加入到Activity显示
一.动态添加控件.设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的 ...
最新文章
- 剑指offer_第10题_矩形覆盖
- Delphi的彩蛋 (好像Delphi5~Delphi7都可以)
- 玩转springboot:thymeleaf模板引擎入门程序
- 一篇文章弄懂Java反射基础和反射的应用场景
- Sqlserver存储过程和C#分页类简化你的代码!
- linux 隐藏显示终端光标
- mysql查询触发器_mysql查看所有触发器以及存储过程等操作集合【转】
- 物联网平台之争 巨头竞合并存
- Structure from Motion综述
- matlab进阶摸索篇——彩色图直方图均衡化
- 基于simulink的微电网虚拟同步发电机vsg控制系统仿真
- 千姿百态项目经理2——“缥缈”项目经理
- 从mitt、tiny-emitter源码中学习手写订阅发布
- 介绍中国传统节日的网页html,介绍中国传统节日的作文4篇
- 阿里云 IOT 物联网平台简单使用【随笔】
- IMP-00058: IMP-00000: 未成功终止导入
- matlab win32错误,尝试运行Matlab-Compiler-Runtime应用程序时Windows 7中出现SxS错误
- 中建五局电子合同:打通全业务数字化链路
- 培养你的逻辑思维能力
- 电视盒子 android tv6,ipad tv6电视棒使用方法图文教程
热门文章
- python 开发浏览器插件,利用firebreath开发跨浏览器插件
- 同等学力申硕 计算机科学与技术
- GPU编程的学习之路(1)
- Redis-什么是缓存雪崩、缓存击穿、缓存穿透
- 测试音质好坏的软件,敢挑战吗? 测测你是否真能听出好音质
- 【python】使用python将多个视频合并、延长视频的时间
- python将四通道图片转为三通道图片
- 王者该服务器未获取角色信息,王者荣耀体验服现实未获取角色信息 | 手游网游页游攻略大全...
- [class]与[class=]
- linux磁盘分区表 清理,linux 磁盘分区表