Pregunta

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:

  

Si las mediciones de texto son importantes para su aplicación, es posible   para su cálculo usando las funciones de cuarzo 2D. Sin embargo, es posible que primero   considerar el uso de ATSUI, cuya fuerza está en la disposición del texto y   medición. ATSUI tiene varias funciones que obtienen medidas del texto. No   sólo se puede obtener métricas de texto después de la presentación, pero en los casos raros   que los necesite, puede obtener medidas del texto antes de maquetación. diferente a   Cuarzo, para lo cual debe realizar los cálculos usted mismo, ATSUI   calcula las mediciones para usted. Por ejemplo, se puede obtener el   rectángulo que bordea la imagen para el 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   Cuarzo lo dibuja:

     
      
  1. Llame a la CGContextGetTextPosition función para obtener la posición del texto actual.
  2.   
  3. Ajuste el modo de dibujo de texto a kCGTextInvisible utilizando el CGContextSetTextDrawingMode función.
  4.   
  5. Dibujar el texto llamando a la función CGContextShowText para dibujar el texto en la posición del texto actual.
  6.   
  7. Determine la posición texto final llamando a la función CGContextGetTextPosition.
  8.   
  9. Restar la posición a partir de la posición final para determinar el ancho del texto.
  10.   

Aquí están mis preguntas:

  1. ¿Es realmente la mejor manera de determinar el ancho de una cadena usando núcleo de gráficos? Parece frágil, y desde mi texto coexiste con elementos gráficos 2D, me gustaría usar el mismo contexto de toda la representación. Tenía la esperanza de que habría algún método compacto, como:

    CGContextGetTextWidthAndHeight(context, text);
    
  2. He leído que ATSUI es obsoleta y que va a ser reemplazado por Core texto. ¿Es cierto y si es así, es en iOS?

¿Fue útil?

Solución

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

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

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

En 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:

Otros consejos

Cuando se realizan operaciones sobre la base de hilos que no sean el hilo de interfaz de usuario, se debe utilizar la técnica que describe. Esto es especialmente importante tener en cuenta al usar cosas como CATiledLayer, que realiza que está haciendo de forma asíncrona en las discusiones de fondo, o en la elaboración de gráficos personalizados en el fondo por cualquier otra razón.

Estoy de acuerdo con PGB cuando estás haciendo gráficos "simples" y se le garantiza que se ejecuta en el hilo principal. Sin embargo, sizeWithFont está haciendo lo mismo que la técnica que ha descrito - es simplemente lo hace por usted, utilizando UIGraphicsGetCurrentContext ()

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top