objective framework developer apple apis ios objective-c quartz-graphics core-text

framework - swift ios documentation



iOS: ¿Cómo se mide el ancho y el alto de una cuerda con Quartz? (2)

Antes de hacer mis preguntas, esto es de la documentación de Apple sobre cómo determinar el ancho de una cuerda usando Quartz:

Si las mediciones de texto son importantes para su aplicación, es posible calcularlas utilizando las funciones Quartz 2D. Sin embargo, primero debe considerar el uso de ATSUI, cuya fuerza está en el diseño y la medición del texto. ATSUI tiene varias funciones que obtienen métricas de texto. No solo puede obtener métricas de texto posteriores al diseño, sino que, en los casos excepcionales que las necesita, puede obtener métricas de texto anteriores al diseño. A diferencia de Quartz, para el que debe realizar los cálculos usted mismo, ATSUI calcula las mediciones por usted. Por ejemplo, puede obtener el rectángulo de delimitación de la imagen para texto llamando a la función ATSUI ATSUMeasureTextImage.

Si decide que el texto de cuarzo se adapta mejor a sus necesidades que ATSUI (o Cocoa), puede seguir estos pasos para medir el ancho del texto antes de que Quartz lo dibuje:

  1. Llame a la función CGContextGetTextPosition para obtener la posición actual del texto.
  2. Establezca el modo de dibujo de texto en kCGTextInvisible mediante 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 inicial de la posición final para determinar el ancho del texto.

Aquí están mis preguntas:

  1. ¿Es esta realmente la mejor manera de determinar el ancho de una cadena usando Core Graphics? Parece endeble y como mi texto coexiste con elementos gráficos 2D, me gustaría usar el mismo contexto para todas las representaciones. Esperaba que hubiera algún método compacto, como:

    CGContextGetTextWidthAndHeight(context, text);

  2. Leí que ATSUI está desactualizado y que será reemplazado por Core Text. ¿Es eso cierto y si es así, está en iOS?


Al realizar operaciones de dibujo en subprocesos distintos del subproceso de la interfaz de usuario, debe utilizar la técnica que describió. Es especialmente importante tener en cuenta esto cuando se utilizan elementos como CATiledLayer, que realiza la representación de forma asíncrona en subprocesos en segundo plano, o cuando se dibujan gráficos personalizados en segundo plano por cualquier otro motivo.

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


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

A partir de iOS 7.0, estos métodos son :

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

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

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