Resize CATextLayer para ajustar el texto en iOS

Toda mi investigación hasta ahora parece indicar que no es posible hacer esto con precisión. Las únicas dos opciones disponibles para mí al principio fueron:

a) Uso de un administrador de diseño para CATextLayer: no disponible en iOS a partir de 4.0

b) Use sizeWithFont: restrictinedToSize: lineBreakMode: y ajuste el marco de CATextLayer de acuerdo con el tamaño devuelto aquí.

Option (b), siendo el enfoque más simple, debería funcionar. Después de todo, funciona perfectamente con UILabels. Pero cuando apliqué el mismo cálculo de trama a CATextLayer, la trama siempre resultó ser un poco más grande de lo esperado o necesario.

Resulta que el espacio entre líneas en CATextLayers y UILabels (para la misma fuente y tamaño) es diferente. Como resultado, sizeWithFont (cuyos cálculos de espacio entre líneas coincidirían con el de UILabels) no devuelve el tamaño esperado para CATextLayers.

Esto se demuestra aún más imprimiendo el mismo texto usando un UILabel, en comparación con un CATextLayer y comparando los resultados. El texto en la primera línea se superpone perfectamente (siendo la misma fuente), pero el espacio entre líneas en CATextLayer es un poco más corto que en UILabel. (Lo siento, no puedo subir una captura de pantalla en este momento ya que las que ya tengo contienen datos confidenciales, y actualmente no tengo tiempo para hacer un proyecto de muestra para obtener capturas de pantalla limpias. Las subiré más tarde para la posteridad, cuando Tengo el tiempo)

Esta es una diferencia extraña, pero pensé que sería posible ajustar el espacio en CATextLayer especificando el atributo apropiado para la NSAttributedString que uso allí, pero ese no parece ser el caso. Buscando en CFStringAttributes.h No puedo encontrar un solo atributo que pueda estar relacionado con el espacio entre líneas.

Línea de fondo

Por lo tanto, parece que no es posible usar CATextLayer en iOS en un escenario donde se requiere que la capa se ajuste a su texto. ¿Estoy en lo cierto o me estoy perdiendo algo?

PD

La razón por la que quería usar CATextLayer y NSAttributedString es porque la cadena que se mostrará debe tener un color diferente en diferentes puntos. Supongo que tendría que volver a dibujar las cuerdas a mano como siempre ... por supuesto, siempre existe la opción de piratear los resultados de sizeWithFont para obtener la altura de línea adecuada.

busar un poco de las etiquetas de 'código' para que la publicación sea más legible.

No puedo etiquetar la publicación con 'CATextLayer'. Sorprendentemente, tales etiquetas no existen en este momento. Si alguien con suficiente reputación se encuentra con esta publicación, etiquétala en consecuencia.

Respuestas a la pregunta(3)

Su respuesta a la pregunta