將表情字符串轉(zhuǎn)化成對應的emoji表情圖片

有時候我們得到表情字符串想讓它對應的顯示表情,那這樣的話該怎么做呢?前段時間就遇到了這方面的需求鸡挠,在請求數(shù)據(jù)的時候辉饱,后臺返回的字符串中包含 :sad: 這類型的表情字符串,如果直接將內(nèi)容放到Label上顯示拣展,那么顯示的也是 :sad: 這樣的形式彭沼,而:sad:其實對應的表情是
表情圖片

這樣的。
找了很多資料备埃,發(fā)現(xiàn)都得用圖文混排的方式去處理姓惑,其中很多的表情字符串是[大哭]這樣的形式,然后對于:sad:這樣的形式就又有點懵逼了按脚,后來用正則的方式去處理了于毙,發(fā)現(xiàn)確實好用,同時也處理了tableviewCell的自適應高度問題辅搬。接下來和大家分享一下唯沮。

采用的是三方MLLabel,在pod file中添加pod'MLLabel' ,用終端 pod install,將三方導入自己的工程中堪遂。

準備工作做好后介蛉,開始進行編碼
1.在ViewController中導入

#import <MLLabel/NSString+MLExpression.h>

創(chuàng)建全局屬性

@property (nonatomic, strong) NSMutableArray *expressionData;
@property(nonatomic, strong)NSMutableArray *contentArray;
@property(nonatomic, strong)UITableView *tableview;
- (void)viewDidLoad {
  _contentArray = [NSMutableArray arrayWithObjects:@"對待好東西一定不能猶豫,早起搶了張秒殺票 :twisted:  :twisted:",@"終于又等到北京的大課溶褪,好激動 :mrgreen:  :mrgreen:  :mrgreen: 這次和公司小伙伴準備買成團票~ :smile:  :smile:",@"昨天下午部門臨時開了一個緊急的小會甘耿,老總說:聽說起點學院在北京又開總監(jiān)課程呢!上次因為公司在趕項目沒有辦法 :cry: 竿滨,這次一定要報名佳恬,我們竟然想做大做好,就一定要有學習的精神于游,明天大家定好鬧鈴毁葱,搶票N",@":razz:  :roll:  :roll: 報名走一個,修煉贰剥,修煉倾剿,我就要究極變化了~~比卡~比卡~比卡丘",@"看到同事了哈哈哈 :lol:",@"我是得加他們微信才能發(fā)圖片吧?申請加好友也沒人回復鞍龀伞前痘?這是為什么呢? :arrow:",@"回復Uncle Wang :什么時候可以加上呢  :arrow:", @"回復lisa991 :小助手寶寶的微信已經(jīng)被加爆了担忧,請稍安勿躁芹缔,摸摸大 :lol:",@"居然沒人搭理~嚴重打擊了用戶的信任~哼 :mad:  :mad:  :mad:  :mad:  :mad:  :mad:",@"終于等到你~ :razz:  :razz:  :razz:",@"還好有直播,要不然就要遺憾慘了~好開心~~~ :mrgreen:  :mrgreen:  :mrgreen:",@"哦啦啦瓶盛,這次搶到票啦最欠,去高逼格的現(xiàn)場示罗,啦啦啦,好開心 :grin:  :grin:", @"特么周六上班    :mad:",@"從技術(shù)架構(gòu)角度看芝硬,傳統(tǒng)垂直架構(gòu)的特點是本地API接口調(diào)用蚜点,不存在業(yè)務的拆分和互相調(diào)用,使用到什么功能就本地開發(fā)拌阴,非常方便绍绘,不需要過度依賴于其它功能模塊;從考核角度來看迟赃,共享很難推行脯倒。開發(fā)只需要對自己開發(fā)的模塊交付質(zhì)量負責,沒有義務為他人提供并維護公共類庫捺氢,這個非常耗費成本藻丢; 時間依賴很難把控:對于公共類庫的使用者而言,依賴別人提供此功能摄乒,但是功能提供者可能有更重要的事情在做悠反,提供時間無法滿足使用者。與其坐等別人提供馍佑,還不如自己開發(fā)效率高斋否;",nil];
    
    //用正則表達式匹配表情字符串
        MLExpression *exp = [MLExpression expressionWithRegex:@"\\\\:[a-zA-Z0-9\\\\u4e00-\\\\u9fa5\\\\?\\\\!]+\\\\:" plistName:@"Expression" bundleName:@"Emotion"];
        [MLExpressionManager expressionAttributedStringsWithStrings:_contentArray expression:exp callback:^(NSArray *result) {
            self.expressionData = [NSMutableArray arrayWithArray:result];
            [_tableview reloadData];
        }];

        }

匹配方法中plistName和bundleName是你創(chuàng)建的兩個文件。表情字符串是和本地的表情圖片相對應的拭荤,所以應該先把本地的表情圖片放到bundle中茵臭,然后再寫個plist文件,將表情字符串和表情圖片對應上舅世。bundle和plist文件的創(chuàng)建旦委,是在iOS->Resource中。如圖:


創(chuàng)建bundle和plist文件

創(chuàng)建好的兩個文件如圖:


創(chuàng)建好的bundle和plist文件

我們用tableview去顯示相應的內(nèi)容雏亚,首先缨硝,自定義tableviewcell。

#import <UIKit/UIKit.h>

#import <MLLabel/MLLinkLabel.h>
@interface ContentCell : UITableViewCell
+ (CGFloat)heightForExpressionText:(NSAttributedString*)expressionText width:(CGFloat)width;//計算高度
@property (strong, nonatomic)MLLinkLabel *textlabel;
@end

ContentCell.m的相關(guān)實現(xiàn)


#import "ContentCell.h"

@implementation ContentCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        
        [self.contentView addSubview:self.textlabel];
        
       
        
    }
    return self;
}

-(void)layoutSubviews{
    [super layoutSubviews];
    
    self.textlabel.frame = CGRectMake(13, 0, self.contentView.frame.size.width - 26, self.contentView.frame.size.height);
    
}


#pragma mark - getter
- (MLLinkLabel *)textlabel
{
    if (!_textlabel) {
        _textlabel = [MLLinkLabel new];
        _textlabel.textColor = [UIColor colorWithRed:0.51 green:0.51 blue:0.51 alpha:1];;
        //        _textlabel.backgroundColor = [UIColor colorWithRed:0.137 green:0.780 blue:0.118 alpha:1.000];
        
        _textlabel.font = [UIFont systemFontOfSize:14.0f];
        
        _textlabel.numberOfLines = 0;
        _textlabel.lineSpacing = 2.0f;//行間距
        //_textlabel.linkTextAttributes = @{NSForegroundColorAttributeName:[UIColor colorWithRed:0.51 green:0.51 blue:0.51 alpha:1]};//帶鏈接時鏈接的顏色
        
    }
    return _textlabel;
}

#pragma mark - height
static MLLinkLabel * kProtypeLabel() {
    static MLLinkLabel *_protypeLabel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _protypeLabel = [MLLinkLabel new];
        _protypeLabel.font = [UIFont systemFontOfSize:14.0f];
        
        _protypeLabel.numberOfLines = 0;
        //        _protypeLabel.textInsets = UIEdgeInsetsMake(10, 10, 10, 10);
        //        _protypeLabel.lineHeightMultiple = 1.1f;
        _protypeLabel.lineSpacing = 2.0f;
    });
    return _protypeLabel;
}


+ (CGFloat)heightForExpressionText:(NSAttributedString*)expressionText width:(CGFloat)width
{
    
    width-=13.0f;
    
    MLLinkLabel *label = kProtypeLabel();
    label.attributedText = expressionText;
    return [label preferredSizeWithMaxWidth:width].height + 5.0f*2; //上下間距
}



@end
//創(chuàng)建tableview罢低,實現(xiàn)相應的代理方法
-(void)loadView{
    [super loadView];
    _tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 24, self.view.frame.size.width, self.view.frame.size.height - 24) style:UITableViewStylePlain];
    _tableview.delegate = self;
    _tableview.tableFooterView = [[UIView alloc] init];
    _tableview.dataSource = self;
    [self.view addSubview:_tableview];
    [_tableview setSeparatorInset:UIEdgeInsetsMake(0, 13, 0, 13)];
    
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _contentArray.count;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (_expressionData.count == 0) {
        return 0;
    }else{
    CGFloat height = [ContentCell heightForExpressionText:self.expressionData[indexPath.row] width:self.view.frame.size.width-26];
    
    return height;
    }
    
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"cell";
    ContentCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        cell = [[ContentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    if (_expressionData.count != 0) {
        cell.textlabel.attributedText = self.expressionData[indexPath.row];
    }
    
    
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}

這樣查辩,就可以把表情字符串轉(zhuǎn)換成對應的表情圖片了,同時也可以做到tableviewcell的自適應高度网持。結(jié)果如圖


結(jié)果圖

如果有任何問題宜岛,歡迎指出或留言。

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末功舀,一起剝皮案震驚了整個濱河市萍倡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌日杈,老刑警劉巖遣铝,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莉擒,居然都是意外死亡酿炸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門涨冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來填硕,“玉大人,你說我怎么就攤上這事鹿鳖”饷校” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵翅帜,是天一觀的道長姻檀。 經(jīng)常有香客問我,道長涝滴,這世上最難降的妖魔是什么绣版? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮歼疮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己久妆,他們只是感情好窒升,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赡矢,像睡著了一般杭朱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吹散,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天痕檬,我揣著相機與錄音,去河邊找鬼送浊。 笑死梦谜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的袭景。 我是一名探鬼主播唁桩,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耸棒!你這毒婦竟也來了荒澡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤与殃,失蹤者是張志新(化名)和其女友劉穎单山,沒想到半個月后碍现,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡米奸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年昼接,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悴晰。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡慢睡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铡溪,到底是詐尸還是另有隱情漂辐,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布棕硫,位于F島的核電站髓涯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哈扮。R本人自食惡果不足惜复凳,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶泵。 院中可真熱鬧育八,春花似錦、人聲如沸赦邻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惶洲。三九已至按声,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恬吕,已是汗流浹背签则。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铐料,地道東北人渐裂。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像钠惩,于是被迫代替她去往敵國和親柒凉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • [The Swift Programming Language 中文版]本頁包含內(nèi)容: String是例如"hel...
    風林山火閱讀 757評論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫篓跛、插件膝捞、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評論 4 62
  • 如果說一句 帶我走吧 你就能像鳥兒一樣 煽動潔白的翅膀 帶我飛翔 如果我能伸手摸到天空 在云朵間蹦跳 我會拿起那只...
    李知零陵閱讀 629評論 3 1
  • 東姐一日一文 41/90 大家好蔬咬,我是東姐晗媽鲤遥,是美國正面管教協(xié)會認證的家長講師,文案策劃導師林艘。感謝老朋友收看盖奈,也...
    東姐閱讀 384評論 0 0