ios uiimage nsattributedstring

ios - Extraer UIImage de la cadena NSAttributed



nsattributedstring (3)

Lo que estoy haciendo es:

  1. NSATTRIBUTE STRING = NSSTRING + UIIMAGE''s;
  2. NSDATA = CADENA NSATTRIBUIDA;
  3. TAMBIÉN puedo convertir nsdata a cadena nsattributed
  4. STRING NSATTRIBUTED = NSDATA:
  5. Y luego extraer el anidamiento de una cadena NSAttributed
  6. NSSTRING = [cadena de cadena NSATTRIBUTED];

Consulta:

¿Cómo puedo obtener IMÁGENES de STRING NSATTRIBUTED;

  • UIIMAGE = de la cadena NSATTRIBUTED;
  • ARRAYOFIMAGE = de la cadena NSATTRIBUTED;

En Swift 3: (con el equivalente de macOS here )

func textViewDidChange(_ textView: UITextView) { // other code... let range = NSRange(location: 0, length: textView.attributedText.length) if (textView.textStorage.containsAttachments(in: range)) { let attrString = textView.attributedText var location = 0 while location < range.length { var r = NSRange() let attrDictionary = attrString?.attributes(at: location, effectiveRange: &r) if attrDictionary != nil { // Swift.print(attrDictionary!) let attachment = attrDictionary![NSAttachmentAttributeName] as? NSTextAttachment if attachment != nil { if attachment!.image != nil { // your code to use attachment!.image as appropriate } } location += r.length } } } }


Larme el código Larme a Larme 3

var imagesArray = [Any]() textView.attributedText.enumerateAttribute(NSAttachmentAttributeName, in: NSRange(location: 0, length: textView.attributedText.length), options: [], using: {(value,range,stop) -> Void in if (value is NSTextAttachment) { let attachment: NSTextAttachment? = (value as? NSTextAttachment) var image: UIImage? = nil if ((attachment?.image) != nil) { image = attachment?.image } else { image = attachment?.image(forBounds: (attachment?.bounds)!, textContainer: nil, characterIndex: range.location) } if image != nil { imagesArray.append(image) } } })


NSAttributedString enumerar NSAttributedString buscando NSTextAttachment s.

NSMutableArray *imagesArray = [[NSMutableArray alloc] init]; [attributedString enumerateAttribute:NSAttachmentAttributeName inRange:NSMakeRange(0, [attributedString length]) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { if ([value isKindOfClass:[NSTextAttachment class]]) { NSTextAttachment *attachment = (NSTextAttachment *)value; UIImage *image = nil; if ([attachment image]) image = [attachment image]; else image = [attachment imageForBounds:[attachment bounds] textContainer:nil characterIndex:range.location]; if (image) [imagesArray addObject:image]; } }];

Como puede ver, existe la prueba if ([attachment image]) . Eso es porque parece que si creó el NSTextAttachment para poner con NSAttachmentAttributeName existirá y su imagen estará allí. Pero si usa, por ejemplo, una imagen de la web y la convierte como NSTextAttachment de un código HTML, entonces [attachment image] será nula y no podrá obtener la imagen.

Puede ver el uso de puntos de interrupción con este fragmento (con la configuración de la URL de la imagen real y un nombre de imagen real del paquete. NSString * htmlString = @ "http: // anImageURL /"> Blahttp: // anOtherImageURL / "> Prueba de prueba ";

NSError *error; NSAttributedString *attributedStringFromHTML = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute:@(NSUTF8StringEncoding)} documentAttributes:nil error:&error]; NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init]; [textAttachment setImage:[UIImage imageNamed:@"anImageNameFromYourBundle"]]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedStringFromHTML]; [attributedString appendAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];