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]; } } }]; }