#import "HWEmotionTextView.h"
#import "HWEmotion.h"
#import "HWEmotionAttachment.h"
@implementation HWEmotionTextView
- (id)initWithFrame:(CGRect)frame
{
self = [superinitWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)insertEmotion:(HWEmotion *)emotion
{
if (emotion.code) {
// insertText : 将文字插入到光标所在的位置
[self insertText:emotion.code.emoji];
} else if (emotion.png) {
// 加载图片
NSTextAttachment *attch = [[NSTextAttachmentalloc]init];
attch.image = [UIImageimageNamed:emotion.png];
// HWEmotionAttachment *attch = [[HWEmotionAttachmentalloc] init];
// attch.emotion = emotion;(用来替换上边两句)
CGFloat attchWH = self.font.lineHeight;
attch.bounds = CGRectMake(0, -4, attchWH, attchWH);
// 根据附件创建一个属性文字
NSAttributedString *imageStr = [NSAttributedStringattributedStringWithAttachment:attch];
// 插入属性文字到光标位置
[self insertAttributeText:imageStr];
}
}
/**
selectedRange :
1.本来是用来控制textView的文字选中范围
2.如果selectedRange.length为0,selectedRange.location就是textView的光标位置
关于textView文字的字体
1.如果是普通文字(text),文字大小由textView.font控制
2.如果是属性文字(attributedText),文字大小不受textView.font控制,应该利用NSMutableAttributedString的- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;方法设置字体
**/
- (void)insertAttributeText:(NSAttributedString *)text
{
NSMutableAttributedString *attributedText = [[NSMutableAttributedStringalloc]init];
// 拼接之前的文字(图片和普通文字)
[attributedText appendAttributedString:self.attributedText];
// 拼接图片
NSUInteger loc =self.selectedRange.location;
// [attributedText insertAttributedString:text atIndex:loc];
[attributedText replaceCharactersInRange:self.selectedRangewithAttributedString:text];
// 设置字体
[attributedText addAttribute:NSFontAttributeNamevalue:self.fontrange:NSMakeRange(0, text.length)];
self.attributedText = attributedText;
// 移除光标到表情的后面
self.selectedRange =NSMakeRange(loc +1,0);
}
- (NSString *)fullText
{
NSMutableString *fullText = [NSMutableStringstring];
// 遍历所有的属性文字(图片、emoji、普通文字)
[self.attributedTextenumerateAttributesInRange:NSMakeRange(0,self.attributedText.length)options:0usingBlock:^(NSDictionary *attrs,NSRange range,BOOL *stop) {
// 如果是图片表情
HWEmotionAttachment *attch = attrs[@"NSAttachment"];
if (attch) { // 图片
[fullText appendString:attch.emotion.chs];
} else { // emoji、普通文本
// 获得这个范围内的文字
NSAttributedString *str = [self.attributedTextattributedSubstringFromRange:range];
[fullText appendString:str.string];
}
}];
return fullText;
}
/**
selectedRange :
1.本来是用来控制textView的文字选中范围
2.如果selectedRange.length为0,selectedRange.location就是textView的光标位置
关于textView文字的字体
1.如果是普通文字(text),文字大小由textView.font控制
2.如果是属性文字(attributedText),文字大小不受textView.font控制,应该利用NSMutableAttributedString的- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;方法设置字体
**/
@end
#import "HWEmotionAttachment.h"
#import "HWEmotion.h"
@implementation HWEmotionAttachment
- (void)setEmotion:(HWEmotion *)emotion
{
_emotion = emotion;
self.image = [UIImageimageNamed:emotion.png];
}
/**
* 删除文字
*/
- (void)emotionDidDelete
{
[self.textViewdeleteBackward];
}