2009-05-27 16 views
19

Antes de pedir a mis preguntas, esto es de la documentación de Apple re: cómo determinar el ancho de una cadena usando cuarzo:iPhone SDK: ¿Cómo mides el ancho y la altura de una cuerda usando Quartz?

Si las mediciones de texto son importantes para su aplicación, es posible a calcular utilizando cuarzo Funciones 2D Sin embargo, es posible que primero considere utilizar ATSUI, cuya fortaleza está en el diseño del texto y la medición . ATSUI tiene varias funciones que obtienen métricas de texto. No solo puede obtener métricas de texto posteriores al diseño, pero en los raros casos las necesita, puede obtener métricas de texto antes del diseño. A diferencia de Quartz, para lo cual debe realizar los cálculos usted mismo, ATSUI calcula las medidas por usted. Por ejemplo, puede obtener el rectángulo delimitador de imágenes para texto llamando a la función ATSUI ATSUMeasureTextImage.

Si decide que el texto de cuarzo se adapte a sus necesidades mejor que ATSUI (o cacao), puede seguir estos pasos para medir la anchura del texto antes de cuarzo dibuja:

  1. Llame a la función CGContextGetTextPosition a obtener la posición actual del texto
  2. Establezca el modo de dibujo de texto en kCGTextInvisible con la función CGContextSetTextDrawingMode.
  3. Dibuje el texto llamando a la función CGContextShowText para dibujar el texto en la posición actual del texto.
  4. Determine la posición final del texto llamando a la función CGContextGetTextPosition.
  5. Reste la posición de inicio desde la posición final para determinar el ancho del texto.

Aquí están mis preguntas:

  1. Lo que tienes es la mejor manera de determinar el ancho de una cadena usando núcleo de gráficos? Parece endeble y dado que mi texto coexiste con elementos gráficos 2D, me gustaría utilizar el mismo contexto para todas las representaciones. Esperaba que hubiera algún método compacto, como:

    CGContextGetTextWidthAndHeight (context, text);

  2. He leído que ATSUI está desactualizado y va a ser reemplazado por Core Text. ¿Es cierto? Si es así, ¿está en el SDK de iPhone?

+0

El texto principal ahora se envía en iOS 4. Sin embargo, los métodos que pgb respondieron son más simples. – Eonil

Respuesta

22

En el iPhone SDK, hay una familia de métodos de NSString que proporcionan lo que quieres.

A partir de iOS 7.0, these methods are:

- boundingRectWithSize:options:attributes:context: 
- sizeWithAttributes: 

En las versiones anteriores de iOS que teníamos estos, ahora en desuso:

– sizeWithFont: 
– sizeWithFont:forWidth:lineBreakMode: 
– sizeWithFont:constrainedToSize: 
– sizeWithFont:constrainedToSize:lineBreakMode: 
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 
+0

No me di cuenta de que se podían mezclar y combinar llamadas de gráficos básicos con objetos de Objective-C ... CG tiene su propia función de dibujo de texto basada en matrices de matrices const pero con timbres y silbatos limitados. Parece que el "contexto actual" simplemente significa el último contexto instanciado, por ejemplo: \t CGContextSetFillColorWithColor (context, color.CGColor); \t [texto drawAtPoint: origen withFont: font]; Gracias por el gran consejo! –

+1

En realidad, estoy bastante seguro de que en el contexto actual se refieren al contexto devuelto por UIGraphicsGetCurrentContext() –

+0

No se puede mezclar y combinar en circunstancias específicas, específicamente; cualquier cosa que llame a UI___ (como UIGraphicsGetCurrentContext()) de cualquier hilo que no sea el hilo principal con frecuencia fallará. Este es un problema grave, especialmente cuando usa cosas como CATiledLayer, que realiza su representación asincrónicamente en subprocesos de fondo. – Steve

0

Al realizar operaciones sobre la base de las discusiones que no sean el hilo de interfaz de usuario, debe usar la técnica que describió.Esto es especialmente importante a tener en cuenta cuando se utilizan elementos como CATiledLayer, que realiza su representación de forma asincrónica en subprocesos de fondo, o cuando dibuja gráficos personalizados en el fondo por cualquier otro motivo.

Estoy de acuerdo con PGB cuando está haciendo gráficos "simples" y está garantizado que se ejecuta en el hilo principal. Sin embargo, sizeWithFont está haciendo lo mismo que la técnica que describiste, simplemente lo hace por ti usando UIGraphicsGetCurrentContext().

Cuestiones relacionadas