ios - tamano - cómo se puede cambiar el tamaño del texto de una página web desde el navegador
Escalar el tamaño de letra para que quepa verticalmente en UILabel (2)
Quiero tomar una UILabel estándar y aumentar el tamaño de la fuente para que llene el espacio vertical. Tomando la inspiración de la respuesta aceptada para esta pregunta , definí una subclase en UILabel con esta implementación drawRect:
- (void)drawRect:(CGRect)rect
{
// Size required to render string
CGSize size = [self.text sizeWithFont:self.font];
// For current font point size, calculate points per pixel
float pointsPerPixel = size.height / self.font.pointSize;
// Scale up point size for the height of the label
float desiredPointSize = rect.size.height * pointsPerPixel;
// Create and assign new UIFont with desired point Size
UIFont *newFont = [UIFont fontWithName:self.font.fontName size:desiredPointSize];
self.font = newFont;
// Call super
[super drawRect:rect];
}
Pero esto no funciona, ya que escala la fuente más allá de la parte inferior de la etiqueta. Si quiere replicar esto, comencé con una etiqueta de 289x122 (ancho x altura), Helvetica como fuente y un punto de inicio de tamaño 60 que se adapta cómodamente a la etiqueta. Aquí hay un ejemplo de salida del estándar UILabel y mi subclase usando la cadena "{Hg":
He visto descenders y ascendentes de fuentes, intenté escalar teniendo esto en cuenta en diferentes combinaciones, pero aún no he tenido suerte. Alguna idea, ¿tiene esto algo que ver con las diferentes fuentes que tienen distintas longitudes de descensor y ascendente?
Me pregunto si se trata de un error de redondeo al siguiente tamaño de letra más grande. ¿Podrías escalar ligeramente el rec.size.height? Algo como:
float desiredPointSize = rect.size.height *.90 * pointsPerPixel;
Actualización: su cálculo de puntoPerPixel está al revés. En realidad, divide los píxeles por puntos de fuente, en lugar de dividirlos por píxeles. Cambie esos y funciona todo el tiempo. Solo por minuciosidad, aquí está el código de muestra que probé:
//text to render
NSString *soString = [NSString stringWithFormat:@"{Hg"];
UIFont *soFont = [UIFont fontWithName:@"Helvetica" size:12];
//box to render in
CGRect rect = soLabel.frame;
//calculate number of pixels used vertically for a given point size.
//We assume that pixel-to-point ratio remains constant.
CGSize size = [soString sizeWithFont:soFont];
float pointsPerPixel;
pointsPerPixel = soFont.pointSize / size.height; //this calc works
//pointsPerPixel = size.height / soFont.pointSize; //this calc does not work
//now calc which fontsize fits in the label
float desiredPointSize = rect.size.height * pointsPerPixel;
UIFont *newFont = [UIFont fontWithName:@"Helvetica" size:desiredPointSize];
//and update the display
[soLabel setFont:newFont];
soLabel.text = soString;
Esa escala y ajuste dentro de la caja de etiquetas para cada tamaño que probé, que van desde fuentes de 40pt a 60pt. Cuando invertí el cálculo, vi los mismos resultados con la fuente demasiado alta para la caja.
Su cálculo para pointsPerPixel
está en el modo incorrecto, debería ser ...
float pointsPerPixel = self.font.pointSize / size.height;
Además, tal vez este código debe estar en layoutSubviews
ya que la única vez que se debe cambiar la fuente es cuando cambia el tamaño del marco.