[代碼] 類似 YYText 将表情文本轉換成表情字元
一,經曆
1> 由于工作需要,得把 UITextView 中的屬性文本轉換成普通文字,并将處理後的普通文字轉換成屬性文本.
2> 将屬性文本轉換成普通文字簡單,可以調用屬性文本的enumerateAttribute:inRange:options:usingBlock:方法.
3> 如何将普通文字中的表情符号[:xx]轉換成顯示的表情呢?這是一個很麻煩的過程,先貼上我研究了三四個小時的代碼.
1 -(NSMutableAttributedString *)EmojiTextInTextView:(NSString*)text
2 {
3 NSMutableAttributedString *emojiText = [[NSMutableAttributedString alloc]initWithString:text];
4 NSArray *keys = [self.emojiManager.dictAllEmoji allKeys];
5
6 // 若存在[:就周遊所有的表情
7 do {
8 BOOL bFindEmoji = NO;
9 for (id key in keys) {
10 // 有表情
11 if ([text rangeOfString:key].location != NSNotFound) {
12 bFindEmoji = YES;
13 // 模拟屬性字元串,使用普通文本占領表情位置,友善确定表情位置
14 NSRange range = [text rangeOfString:key];
15 text = [text stringByReplacingCharactersInRange:range withString:@"1"];
16
17 // 轉換成表情圖檔
18 UIImage *img = self.emojiManager.dictAllEmoji[key];
19 EmojiTextAttachment *attach = [[EmojiTextAttachment alloc]initWithData:nil ofType:nil];
20 if(img) attach.image = img;
21 attach.emojiTag = key;
22 NSAttributedString *replaceAttri = [NSAttributedString attributedStringWithAttachment:attach];
23 [emojiText replaceCharactersInRange:range withAttributedString:replaceAttri];
24 if ([text rangeOfString:@"[:"].location == NSNotFound){
25 break;
26 }
27 }
28 }
29 // 若沒有查找到一個表情,就退出
30 if (bFindEmoji == NO) {
31 break;
32 } else {
33 bFindEmoji = NO;
34 }
35 }while ([text rangeOfString:@"[:"].location != NSNotFound);
36 return emojiText;
37 }
4> 一開始沒想到用雙層循環,但是單層循環隻會周遊一次表情字元串,如果文本中有多個表情字元串,就會漏掉,是以必須使用雙層循環,外層用找到[:作為循環終止條件,内層用沒有[:作為跳出跳出條件.
5> 後來漏掉了包含[:但是不是表情字元串的情況,是以我就需要加一個 bool 變量,當周遊一次所有表情字元串,沒有找到就讓該變量置為 NO, 然後跳出第二層循環,排除有[:但是沒有表情包的情況.