usa precio iphone

precio - iphone xr



¿Cómo obtener UILabel(UITextView) tamaño de fuente ajustado automáticamente? (4)

¿Es posible obtener el tamaño de fuente final, después del autoajuste? (la propiedad ajustaFontSizeToFitWidth establecida en YES, y el tamaño de la fuente del texto se está reduciendo para encajar en la etiqueta)

Estoy subclasificando drawTextInRect en UILabel para poner un degradado en el texto, pero el tamaño del degradado debe ser el mismo que el tamaño de la fuente. No puedo obtener el tamaño adecuado de la fuente ajustada ... ¿Es incluso 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);


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

//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;


Mi respuesta no es muy útil para la pregunta original, pero termino aquí cada vez que busco cómo obtener el tamaño de fuente después del ajuste automático. En primer lugar, sizeWithFont ha quedado en desuso en iOS 7.0, como todos sabemos, por lo 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í hay un ejemplo paso a paso:

  • Dos etiquetas con el mismo ancho y diferente longitud de texto:

Quiero, en tiempo de ejecución, cambiar el tamaño de fuente del uilabel principal y el segundo tener el mismo tamaño de fuente.

  • disminuya el tamaño de ambas etiquetas, de modo que el texto de la primera se ajuste al marco, en este caso 12 para ambas:
  • después de haber configurado 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 exactamente al texto:
  • agregue las restricciones de Aspect Ratio entre ancho y alto a ambas etiquetas y la restricción de ancho entre la etiqueta principal y la vista principal:
  • agregue la restricción de ancho de la segunda etiqueta a la etiqueta principal:
  • Ahora puede establecer el tamaño de fuente de las etiquetas como desee:

Aquí hay una captura de pantalla del simulador:

La primera etiqueta cambia de tamaño según el tamaño de la pantalla y el tamaño de la 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 fuente especificados en la última imagen.

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


No puede obtener el tamaño directamente, pero puede calcularlo fácilmente usando estas funciones :

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


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