2015-09-04 by 木易哥哥
智者精选,每天获取励志认知能量 www.5izhjx.com
要实现文图混排效果需要用到的有:富文本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];
}
+ (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;
}
- (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"];
}