UITextView的attributedText含有NSTextAttachment对象、表情包和普通文本的可以遍历。注意:表情包和普通文本被遍历时相似单又被分开。
表情包的插入与移动光标
NSString *str = getNotNilString([emojiStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);
[self.inputTextView.textStorage insertAttributedString:[[NSAttributedString alloc] initWithString:str] atIndex:self.inputTextView.selectedRange.location];
self.inputTextView.selectedRange = NSMakeRange(self.inputTextView.selectedRange.location+str.length, 0);
使用enumerateAttributesInRange遍历
NSAttributedString *attributedText = self.inputTextView.attributedText;
self.model.Body = @"";
if(!isCommonUnitEmpty(self.inputTextView.text))
{
[attributedText enumerateAttributesInRange:NSMakeRange(0, attributedText.length) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:
^(NSDictionary *attributes, NSRange range, BOOL *stop) {
@strongify(self);
DYTextAttachment *attachment = [attributes objectForKey:@"NSAttachment"];
if(attachment)
{
NSLog(@"attributes:%@, range.location:%d,range.length:%d,attachment.description:%@ attachment:%@,", attributes, range.location,range.length,attachment.description, attachment);
if([attachment isKindOfClass:[DYTextAttachment class]] && !isCommonUnitEmptyString(attachment.dataFilePath))
{
if(attachment.dyFileType == DYFileTypeImage)
{
self.model.Body = [NSString stringWithFormat:@"%@<img src=\"%@\"/>", self.model.Body, attachment.dataFilePath];
}
else if(attachment.dyFileType == DYFileTypeVideo)
{
self.model.Body = [NSString stringWithFormat:@"%@<p><video src=\"%@\" controls=\"controls\" style=\"max-width:100%%\"></video></p>", self.model.Body, attachment.dataFilePath];
}
}
}
else
{
NSLog(@"attributes:%@, range.location:%d,range.length:%d, [self.inputTextView.text substringWithRange:range]:%@", attributes, range.location,range.length, [self.inputTextView.text substringWithRange:range]);
NSString *inputStr = [self.inputTextView.text substringWithRange:range];
if(!isCommonUnitEmptyString(inputStr))
{
self.model.Body = [NSString stringWithFormat:@"%@%@", self.model.Body, inputStr];
}
}
}];
}