iOS 文本与图片表情混排的实现

来源:互联网 发布:余弦相似度公式 python 编辑:程序博客网 时间:2024/06/11 19:33

 2015-09-04 by 木易哥哥 


要实现文图混排效果需要用到的有:富文本NSMutableAttributedString,字符替换substringWithRange,以及支持动画gif的ImageIO.h。

写了几个对象TQRichTextView,TQRichTextRunEmoji,SvGifView,废话不多说,列出实现该效果的几个核心代码块。


TQRichTextView.m,

if (richTextRun.drawSelf)

  {

       //动态图片 begin

       CGFloat runPointX = runRect.origin.x + lineOrigin.x;

       CGFloat runPointY = self.frame.size.height- lineOrigin.y-15 ;

        CGRect runRectDraw = CGRectMake(runPointX, runPointY, 18, 18);

        [self drawRunWithRect:runRectDraw emojiString:richTextRun.text];//动态图片,add by edward yang

        [self.runRectDictionary setObject:richTextRun forKey:[NSValue valueWithCGRect:runRectDraw]];

   }

   else

    {

       if (richTextRun)

          {

             [self.runRectDictionary setObject:richTextRun forKey:[NSValue valueWithCGRect:runRect]];

           }

      } 

- (void)drawRunWithRect:(CGRect)rect emojiString:(NSString*)emojiString

{

    NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:emojiString withExtension:@"gif"];

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

    _gifView.backgroundColor = [UIColor clearColor];

    _gifView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

    [self addSubview:_gifView];

    [_gifView startGif];

}


TQRichTextRunEmoji.m

+ (NSArray *) emojiStringArray

{

    return [NSArray arrayWithObjects:@"[微笑]",@"[撇嘴]",@"[]",@"[发呆]",@"[得意]",@"[害羞]",@"[闭嘴]",@"[]",@"[大哭]",@"[尴尬]",@"[发怒]",@"[调皮]",@"[呲牙]",@"[惊讶]",@"[难过]",@"[]",@"[冷汗]",@"[抓狂]",@"[]",@"[偷笑]",@"[白眼]",@"[傲慢]",@"[饥饿]",@"[]",@"[惊恐]",@"[流汗]",@"[憨笑]",@"[奋斗]",@"[疑问]",@"[]",@"[]",@"[]",@"[骷髅]",@"[敲打]",@"[再见]",@"[抠鼻]",@"[鼓掌]",@"[糗大了]",@"[坏笑]",@"[左哼哼]",@"[右哼哼]",@"[哈欠]",@"[鄙视]",@"[委屈]",@"[快哭了]",@"[阴险]",@"[亲亲]",@"[]",@"[可怜]",@"[菜刀]",@"[西瓜]",@"[啤酒]",@"[篮球]",@"[乒乓]",@"[咖啡]",@"[]",@"[猪头]",@"[玫瑰]",@"[凋谢]",@"[示爱]",@"[爱心]",@"[心碎]",@"[蛋糕]",@"[闪电]",@"[炸弹]",@"[红包]",@"[足球]",@"[瓢虫]",@"[便便]",@"[月亮]",@"[太阳]",@"[礼物]",@"[再见]",@"[拥抱]",@"[]",@"[]",@"[握手]",@"[抱拳]",@"[勾引]",@"[拳头]",@"[差劲]",@"[爱你]",@"[NO]",@"[OK]",nil];

}


+ (NSArray *)runsForAttributedString:(NSMutableAttributedString *)attributedString

{

    NSString *markL       = @"[";

    NSString *markR       = @"]";

    NSString *string      = attributedString.string;

    NSMutableArray *array = [NSMutableArray array];

    NSMutableArray *stack = [[NSMutableArray alloc] init];

    

    for (int i = 0; i < string.length; i++)

    {

        NSString *s = [string substringWithRange:NSMakeRange(i, 1)];

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

        if (([s isEqualToString:markL]) || ((stack.count > 0) && [stack[0] isEqualToString:markL]))

        {

            if (([s isEqualToString:markL]) && ((stack.count > 0) && [stack[0] isEqualToString:markL]))

            {

                [stack removeAllObjects];

            }

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

            [stack addObject:s];

            

            if ([s isEqualToString:markR] || (i == string.length - 1))

            {

                NSMutableString *emojiStr = [[NSMutableString alloc] init];

                for (NSString *c in stack)

                {

                    [emojiStr appendString:c];

                }

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

                if ([[TQRichTextRunEmoji emojiStringArray] containsObject:emojiStr])

                {

                    NSRange range = NSMakeRange(i + 1 - emojiStr.length, emojiStr.length);

                    

                    [attributedString replaceCharactersInRange:range withString:@"   "];

                    TQRichTextRunEmoji *run = [[TQRichTextRunEmoji alloc] init];

                    run.range    = NSMakeRange(i + 1 - emojiStr.length, 1);

                    run.text     = emojiStr;

                    run.drawSelf = YES;

                    [run decorateToAttributedString:attributedString range:run.range];

                    

                    [array addObject:run];

                    i = i -emojiStr.length; //代替多少,后退多少,add by edward yang

                }

                

                [stack removeAllObjects];

            }

        }

    }

    

    return array;

}


SVGifView.m

- (void)startGif

{

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];

    

    NSMutableArray *times = [NSMutableArray arrayWithCapacity:3];

    CGFloat currentTime = 0;

    int count = _frameDelayTimes.count;

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

        [times addObject:[NSNumber numberWithFloat:(currentTime / _totalTime)]];

        currentTime += [[_frameDelayTimes objectAtIndex:i] floatValue];

    }

    [animation setKeyTimes:times];

    

    NSMutableArray *images = [NSMutableArray arrayWithCapacity:3];

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

        [images addObject:[_frames objectAtIndex:i]];

    }

    

    [animation setValues:images];

    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

    animation.duration = _totalTime;

    animation.delegate = self;

    animation.repeatCount = HUGE_VALF;

    

    [self.layer addAnimation:animation forKey:@"gifAnimation"];

}

效果如下


0 0
原创粉丝点击