iOS自定义表情的实现

现在很多App都有自己的自定义的表情,客户端可能要实现自己定表情的选择、发送和显示,这里我介绍一种简单的自定义表情的实现思路和代码。
以下介绍基本可以实现聊天中对自定义表情的需求,可结合下图来理解:
这里写图片描述
资源准备:

  • 自定义表情图片的命名。
  • 每个自定义表情的意思。
  • emtionMeans.plist:key–表情选择器每个表情对应的tag值,value–每个表情的意思。
  • emtions.plist:key–每个表情的意思,value–每个表情对应的图片。

实现逻辑:

  • 初始化表情选择器,主要根据以上两个plist表格相互转换来获取需要的东西。
    创建一个EmojiView继承自UIVIew,主要代码如下:
-(void)initView{

    NSString * filePath = [[NSBundle mainBundle] pathForResource:@"emtions" ofType:@"plist"];
    //表情含义--表情图片
    NSDictionary * emojDic = [[NSDictionary alloc] initWithContentsOfFile:filePath];
    //表情含义
    NSArray * keysArray = @[@"[憨笑]",@"[奸笑]",@"[惊呆]",@"[疑问]"];
    for (int i = 0; i < keysArray.count; i++) {
        UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(20 + i*30, 20, 25, 25);
        button.tag = 60000 + i;
        NSString * key = keysArray[i];
        //根据含义取得表情图片,展示表情
        [button setImage:[UIImage imageNamed:[emojDic objectForKey:key]] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(selectEmtionClick:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
    }
}

-(void)selectEmtionClick:(UIButton *)button{
    NSString * key = [NSString stringWithFormat:@"%d",(int)button.tag];
    if (self.delegate && [self.delegate respondsToSelector:@selector(selectedEmoji:)]) {
        //根据tag值获取表情含义
        [self.delegate selectedEmoji:self.emojMeansDictionary[key]];
    }
}

-(NSDictionary *)emojMeansDictionary{
    if (!_emojiMeansDictionary) {
        NSString * filePath = [[NSBundle mainBundle] pathForResource:@"emtionMeans" ofType:@"plist"];
        _emojiMeansDictionary = [[NSDictionary alloc] initWithContentsOfFile:filePath];
    }
    return _emojiMeansDictionary;
}

实例化一个EmojView对象即可得到一个自定义表器的选择器。
接下来我们需要一个辅助器,用来判断某个字符串是不是表情字符串以及某一串字符串中是否包含表情。因为现实表情需要用到富文本,一般对内存和性能的消耗比较大,对于不含表情的字符串我们还是直接UILabel来显示更好些,特别是像聊天这样的布局。显示某条聊天消息之前,我们先判断该消息中是否包含表情字符串,在这里我用的是[]来识别的,如果包含[],我们再进一步通过emtionMeans.plist中表情的含义来对比,看这个[]中的内容是否属于表情,如果这两者都满足,则表示该消息中含有自定义表情。
辅助器主要代码:

+(BOOL)isIncludeEmoji:(NSString *)message{
    BOOL isInclude = NO;
    int startLoctaion = 0;
    int endLocation = 0;
    for (int i = 0; i < message.length; i ++) {
        if ([[message substringWithRange:NSMakeRange(i, 1)] isEqualToString:@"["]) {
            //起始位置
            startLoctaion = i;
        }
        if ([[message substringWithRange:NSMakeRange(i, 1)] isEqualToString:@"]"]) {
            //结束位置
            endLocation = i;
        }
        if (endLocation) {
            NSString * expression = [message substringWithRange:NSMakeRange(startLoctaion, endLocation - startLoctaion + 1)];
            isInclude = [EmojiHelper isEmojiString:expression];
            if (isInclude) {
                break;
            }else{
                startLoctaion = 0;
                endLocation = 0;
            }
        }

    }
    return isInclude;
}

+(BOOL)isEmojiString:(NSString *)string{
    BOOL isExpression = NO;
    NSString * filePath = [[NSBundle mainBundle] pathForResource:@"emtionMeans" ofType:@"plist"];
    NSDictionary * expressionMeansDictionary = [[NSDictionary alloc] initWithContentsOfFile:filePath];
    for (NSString * key in [expressionMeansDictionary allKeys]) {
        if ([string isEqualToString:expressionMeansDictionary[key]]) {
            isExpression = YES;
            break;
        }
    }
    return isExpression;
}

最后我们需要一个可以显示我们的表情的Label,iOS自带的UILabel显然不能直接用,这里我用到了一个第三方MLEmojiLabel,用它来做自定义表情的展示。直接用也会有问题,因为自定义表情的资源不同,要显示自己的话需要做修改,另外也做了一些优化(直接从网上下载的第三方在返回经过表情识别处理的Attributed字符串的方法中对表情字符串的识别度不是很精准)。
不过调用很方便,实例化MLEmojiLabel直接调用下面的方法即可显示自己的自定义表情:

[self.emojiLabel setEmojiText:self.emojiString];

做聊天的话可能需要动态改变Label的高度,需要调用上面的方法之后调用一下下面的方法即可:

CGSize textSize = [self.emojiLabel sizeThatFits:CGSizeMake(SCREEN_WIDTH - 160, size.height)];

以上的代码可根据固定的宽度来获取当前的高度。
完整代码点击这里获取
demo效果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/aaaaazq/article/details/80747993