2010-09-08 12 views
20

¿Es posible obtener el tamaño de fuente final, después del autoajuste? (La propiedad ajustaFetSizeToFitWidth se establece en YES, y el tamaño de la fuente de texto se está reduciendo para encajar en la etiqueta)¿Cómo obtener UILabel (UITextView) tamaño de letra ajustado automáticamente?

Estoy subclasando drawTextInRect en UILabel para poner degradado en el texto, pero el tamaño del degradado debe ser el mismo, como el tamaño de la fuente. No puedo obtener el tamaño correcto de la fuente ajustada ... ¿Es posible?

//draw gradient 

    CGContextSaveGState(myContext); 
     CGGradientRef glossGradient; 
     CGColorSpaceRef rgbColorspace; 
     size_t num_locations = 2; 
     CGFloat locations[2] = { 0.0, 1.0 }; 
     CGFloat components[8] = { 1, 1, 1, 0.25, // BOTTOM color 
      1, 1, 1, 0.12 }; // UPPER color 

    //scale and translate so that text would not be rotated 180 deg wrong 
     CGContextTranslateCTM(myContext, 0, rect.size.height); 
     CGContextScaleCTM(myContext, 1.0, -1.0); 

//create mask 
     CGImageRef alphaMask = CGBitmapContextCreateImage(myContext); 
     CGContextClipToMask(myContext, rect, alphaMask); 

     rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
     glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

    //gradient should be sized to actual font size. THIS IS THE PROBLEM - EVEN IF FONT IS AUTO ADUJSTED, I AM GETTING THE SAME ORIGINAL FONT SIZE!!! 

     CGFloat fontCapHeightHalf = (self.font.capHeight/2)+5; 
      CGRect currentBounds = rect; 
     CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)-fontCapHeightHalf); 
     CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)+fontCapHeightHalf); 

     CGContextDrawLinearGradient(myContext, glossGradient, topCenter, midCenter, 0); 

     CGGradientRelease(glossGradient); 
     CGColorSpaceRelease(rgbColorspace); 
    CGContextRestoreGState(myContext); 
+1

posible duplicado de [Cómo calcular el tamaño de un UIFont cuando el texto de la etiqueta está limitado hacia abajo para adaptarse a la anchura?] (Http: // stackoverflow.com/questions/1385338/how-to-calculate-the-size-of-a-uifont-when-text-in-label-is-constrained-down-to-f) –

+1

sí, gracias por señalarme la dirección correcta. No lo encontré antes de publicar mi pregunta. –

Respuesta

17

No se puede obtener el tamaño directamente, pero se puede calcular con bastante facilidad utilizando these functions:

CGFloat actualFontSize; 
[label.text sizeWithFont:label.font 
      minFontSize:label.minimumFontSize 
      actualFontSize:&actualFontSize 
       forWidth:label.bounds.size.width 
      lineBreakMode:label.lineBreakMode]; 
+8

Obsoleto en iOS 7 sin alternativa. – openfrog

+0

@openfrog He publicado una alternativa aquí que funcionará en iOS 7 - http://stackoverflow.com/a/20829315/1445366 no es tan simple pero hace el trabajo bien. –

+0

@openfrog -sizeWithAttributes: es la alternativa. https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/NSString/sizeWithAttributes: –

2
CGSize size = [label.text sizeWithFont:label.font minFontSize:10 actualFontSize:&actualFontSize forWidth:200 lineBreakMode:UILineBreakModeTailTruncation]; 
+2

Obsoleto en iOS 7. – openfrog

+1

¿Esto significa que no hay solución usando Swift? – Narwhal

2

Mi respuesta no es muy útil para la pregunta original, pero Termino aquí cada vez que busco la forma de obtener el tamaño de fuente después del ajuste automático. En primer lugar, sizeWithFont ha quedado obsoleto en iOS 7.0, como todos sabemos, así que tenemos que encontrar otra solución.

Mi solución se ajusta a mi caso, en el que tengo dos etiquetas, una con más restricciones y más texto que la segunda.

Aquí es un ejemplo paso a paso:

  • dos etiquetas tienen el mismo ancho y diferente longitud del texto:

enter image description here

que quiero, en tiempo de ejecución, la tamaño de la fuente de la uilabel principal para cambiar el tamaño y el segundo para tener el mismo tamaño de fuente.

  • disminuir el tamaño de ambas etiquetas, de modo que el texto de la primera uno encaja el marco, en este caso 12 por los dos:

enter image description here

enter image description here

  • Después de configurar las restricciones de posición (en mi ejemplo, las etiquetas permanecen en el centro de la vista principal), actualice los marcos de ambas etiquetas para que se ajusten al texto tal:

enter image description here

  • añadir los Aspect Ratio restricciones entre la anchura y la altura de las dos etiquetas y la restricción de ancho entre la etiqueta principal y la vista de los padres:

enter image description here

enter image description here

  • añadir la restricción de la anchura de la segunda etiqueta de la etiqueta principal:

enter image description here

enter image description here

  • Ahora puede establecer el tamaño de fuente de las etiquetas como desee:

enter image description here

Aquí es una captura de pantalla del simulador:

enter image description here

La primera etiqueta se cambia el tamaño de acuerdo con el tamaño de pantalla y el tamaño de fuente se ajusta en consecuencia. El tamaño de fuente de la segunda etiqueta es el mismo debido a la restricción de ancho y los parámetros de la fuente especificados en la última imagen.

Este es solo un ejemplo que tiene como objetivo mostrar el "truco" detrás de mi solución: unir los marcos de las etiquetas en un tamaño de fuente inicial, para que sea el mismo en tiempo de ejecución. Imagino que esta técnica se podría adaptar a las etiquetas con un tamaño variable, simplemente agregando las restricciones entre las etiquetas después de haber establecido el texto y de haber cambiado el tamaño del marco para que se ajuste al texto.

0

Esta sencilla solución funciona bien para una línea UILabel:

//myLabel - initial label 

UILabel *fullSizeLabel = [UILabel new]; 
fullSizeLabel.font = myLabel.font; 
fullSizeLabel.text = myLabel.text; 
[fullSizeLabel sizeToFit]; 

CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width/fullSizeLabel.bounds.size.width); 

//correct, if new font size bigger than initial 
actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize; 
Cuestiones relacionadas