iPhone SDK: ¿Cómo mide el ancho y la altura de una string usando Quartz?

Antes de hacer mis preguntas, esto se debe a la documentation de Apple: cómo determinar el ancho de una cadena usando Quartz:

Si las medidas de text son importantes para su aplicación, es posible calcularlas usando funciones de Quartz 2D. Sin embargo, primero puede considerar utilizar ATSUI, cuya fuerza está en el layout y la medición del text. ATSUI tiene varias funciones que obtienen métricas de text. No solo puede get métricas de text después del layout, sino que en los casos raros en que las necesita, puede get métricas de text antes del layout. A diferencia de Quartz, para el cual debe realizar los cálculos usted mismo, ATSUI calcula las medidas para usted. Por ejemplo, puede get el rectángulo delimitador de image para text llamando a la function ATSUI ATSUMeasureTextImage.

Si decides que el text Quartz se adapta mejor a tus necesidades que ATSUI (o Cocoa), puedes seguir estos pasos para medir el ancho del text antes de que Quartz lo dibuje:

  1. Llame a la function CGContextGetTextPosition para get la position actual del text.
  2. Establezca el modo de dibujo de text en kCGTextInvisible utilizando la function CGContextSetTextDrawingMode.
  3. Dibuje el text llamando a la function CGContextShowText para dibujar el text en la position actual del text.
  4. Determine la position final del text llamando a la function CGContextGetTextPosition.
  5. Reste la position inicial de la position final para determinar el ancho del text.

Estas son mis preguntas:

  1. ¿Realmente es esta la mejor manera de determinar el ancho de una cadena usando Core Graphics? Parece endeble y como mi text coexiste con elementos charts en 2D, me gustaría usar el mismo context para todo el renderizado. Esperaba que hubiera un método compacto, como:

    CGContextGetTextWidthAndHeight (context, text);

  2. Leí que ATSUI está desactualizado y va a ser reemplazado por Core Text. ¿Es cierto y si es así, es en el iPhone SDK?

En el iPhone SDK, hay una familia de methods en NSString que proporcionan lo que desea.

A partir de iOS 7.0, estos methods son :

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

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

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

Cuando realice operaciones de dibujo en subprocesss que no sean el subprocess UI, debe usar la técnica que describió. Esto es especialmente importante para tener en count al usar cosas como CATiledLayer, que realiza su representación de forma asíncrona en subprocesss de background o al dibujar charts personalizados en segundo plano por cualquier otro motivo.

Estoy de acuerdo con PGB cuando haces charts "simples" y tienes la garantía de estar ejecutando el hilo principal. Sin embargo, sizeWithFont está haciendo lo mismo que la técnica que describiste: simplemente lo hace por usted usando UIGraphicsGetCurrentContext ().