La image de NSTextAttachment no se muestra al dibujar utilizando CoreText

Por alguna razón, no puedo hacer que las imágenes de NSTextAttachment dibujen cuando se utiliza el text central, aunque la misma image se mostraría bien cuando se agrega NSAttributedString a una UILabel.

En iOS, esta representación proporcionará espacios vacíos para NSTextAttachments, para OS X, una image cuadrada [OBJECT] de marcador de position se representa para cada NSTextAttachment en su lugar. ¿Hay que hacer algo más para renderizar imágenes con CoreText?

El código de representación:

CGFloat contextHeight = CGBitmapContextGetHeight(context); CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)_attributedString); CGPathRef path = CGPathCreateWithRect(CGRectMake(rect.origin.x, contextHeight - rect.origin.y - rect.size.height, rect.size.width, rect.size.height), NULL); CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); CFRelease(framesetter); CGPathRelease(path); CGContextSaveGState(context); CGContextSetTextMatrix(context, CGAffineTransformIdentity); CGContextTranslateCTM(context, 0.0f, contextHeight); CGContextScaleCTM(context, 1.0f, -1.0f); CTFrameDraw(frame, context); CGContextRestoreGState(context); CFRelease(frame); 

El motivo es simplemente que NSTextAttachment solo funciona para renderizar un NSAttributedString en una UIView / NSView. No se puede utilizar para renderizar en un CGContext regular.

Hay dos forms posibles de resolver el problema:

  1. Cree un UILabel, CATextLayer o similar y hágalo en el context de charts.
  2. Use CTRunDelegate para pegar espacios en el text, luego pase por todas las líneas a representar y dibuje las imágenes directamente en CGContext manualmente. La forma de hacerlo se detalla aquí: https://www.raywenderlich.com/4147/core-text-tutorial-for-ios-making-a-magazine-app . Espere mucho trabajo si baja esta ruta, pero funciona.