2010-10-10 8 views
9

Puedo dibujar texto enriquecido con Texto central, el problema es colocar imágenes fluyendo con el texto. (iOS SDK 4.1)Cómo dibujar imágenes entre texto enriquecido con CoreText? (iOS)

Intento dibujar algún tipo de texto enriquecido. El problema es que el diseñador colocó muchos íconos entre el texto. Por lo que el texto lo que tengo que dibujar es algo como esto:

Here is a word <an icon image>, and another words. 
The image(<another icon>) should be placed like a glyph. 
It's part of text, not an example. 

<icon> son imágenes. (Esto no es un código. Solo una ilustración.)

Puedo dibujar esto al diseñarlos todos a mano, pero es muy difícil mantener comportamientos complejos de diseño de texto. Así que estoy encontrando una forma de dibujar esto con Core Text.

Respuesta

9

Tengo la solución.

La clave para diseñar contenido no textual es CTRunDelegate. Core Text no admite contenido que no sea de texto, por lo que debe crear espacios en blanco para ellos y dibujarlos o colocarlos usted mismo más tarde.

Una parte de NSAttributedString atribuida con kCTRunDelegateAttributeName llamará a la devolución de llamada registrada para determinar el ancho de cada glifo. Esto le permitirá hacer un espacio en blanco para cada objeto que no sea de texto.

Sin embargo, después de dibujar el texto con Core Text, la información de diseño almacenada con marco/línea/ejecución se invalidará. Por lo tanto, debe dibujar/colocar contenido que no sea de texto después del diseño con framesetter/typesetter, pero antes de dibujar.

Este enlace describe el uso básico de CTRunDelegate:
How to use CTRunDelegate in iPad?


Hay un problema con el sistema central del texto. Originalmente, CTRunDelegate fue diseñado para admitir el ancho variable y la alineación vertical a través de CTRunDelegateCallbacks.getAscent y CTRunDelegateCallbacks.getDescent. Pero la característica de alineación vertical no funciona actualmente. Esto podría ser un error.

que describe este problema aquí: Aligning multiple sized text vertical center instead of baseline with Core Text in iOS

Si usted tiene información sobre este problema, consulte mi pregunta en el enlace.

3

Simplemente establece un delegado para un CTRun dado y el objeto delegado es responsable de informarle al texto principal qué es el espacio de ascenso CTRun, el espacio de descenso y el ancho.

Cuando Core Text "alcanza" un CTRun que tiene un CTRunDelegate pregunta al delegado: ¿cuánto ancho debería dejar para este trozo de datos, qué tan alto debería ser? De esta manera, construyes un agujero en el texto, y luego dibujas tu imagen en ese mismo lugar.

enter image description here

Este es un blog sobre Core Text.It tiene la respuesta para usted.

How To Create a Simple Magazine App with Core Text

Cuestiones relacionadas