Hacer crecer la fuente junto con UILabel (redimensionada por Diseño automático) - cómo hacerlo en Interface Builder?


En una simple aplicación para iPhone Muestro un mosaico de letras (personalizado UIView con una imagen y 2 etiquetas) con el siguiente código en viewDidLoad :

captura de pantalla de la aplicación

DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile"
                                                   owner:self
                                                 options:nil] firstObject];
tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        kWidth,
                        kHeight);
[self.view addSubview:tile];

Esto funciona bien, pero me gustaría hacer que el mosaico de letras crezca - cuando suministre parámetros de ancho y alto más grandes al CGRectMake.

Así que en Xcode 5.1 Interface Builder abro el DraggedTile.xib y habilito "Diseño automático".

Luego para image y letter agrego restricciones a la izquierda, arriba, derecha, bordes inferiores del padre.

Para la etiqueta letter también establezco "Líneas" en 0 y "Prioridad de Resistencia a la Compresión de Contenido" en 1000 (aquí pantalla completa 1 y pantalla completa 2):

Captura de pantalla de Xcode

Captura de pantalla de Xcode

Luego modifico el código para usar mayor ancho y alto:

tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        2 * kWidth,
                        2 * kHeight);

Aquí está el resultado:

captura de pantalla de la aplicación

Tanto el fondo image como la etiqueta letter parecen haber crecido según lo previsto.

Sin embargo, la fuente el tamaño de la etiqueta no ha crecido.

He buscado alrededor y creo que necesito algo como tile.letter.adjustsFontSizeToFitWidth = YES. Pero al mismo tiempo no puedo usarlo con "Diseño automático" activado...

Así que mi pregunta es si hay alguna opción en el "Creador de interfaces" disponible para hacer que el tamaño de la fuente crezca también?

ACTUALIZACIÓN:

He intentado la sugerencia de ismailgulek para establecer el tamaño de fuente a 200 en el creador de interfaces y en el código tile.letter.adjustsFontSizeToFitWidth = YES y eso parece prometedor (aquí pantalla completa):

Captura de pantalla de Xcode

Pero ahora tengo el problema de que he establecido 40px como la restricción letter.bottom en Interface Builder. Pero, ¿qué pasa si necesito un marco de azulejo más grande? ¿Hay alguna manera de usar el porcentaje en lugar del valor absoluto de píxel en esa restricción?

Y otra pregunta es si es posible establecer el adjustsFontSizeToFitWidth en algún lugar del Creador de interfaces o tengo que usar el código fuente para eso? He intentado agregar una clave al " Usuario Defined Runtime Attributes " - pero luego la aplicación se bloquea en el tiempo de ejecución:

Captura de pantalla de Xcode

Author: Alexander Farber, 2014-03-27

5 answers

adjustsFontSizeToFitWidth la propiedad de UILabel no aumentará el tamaño de la fuente, es solo para reducir de acuerdo con la documentación: Normalmente, el texto de la etiqueta se dibuja con el font que especifique en la propiedad font. Sin embargo, si esta propiedad se establece en YES y el texto de la propiedad text excede el rectángulo delimitador de la etiqueta, el receptor comienza a reducir el tamaño de fuente hasta que la cadena se ajuste o se alcance el tamaño mínimo de fuente.

Pero si establece el tamaño de fuente lo suficientemente grande (digamos 200) y establece adjustsFontSizeToFitWidth a YES, creo que obtendrías resultados interesantes y valiosos.

Y no se olvide de establecer Baseline como Align Centers, de lo contrario su texto puede no ser visto correctamente.

Por favor, infórmenos sobre sus resultados.

 26
Author: ismailgulek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-28 00:19:48

Para aquellos que vienen aquí por el título y necesitan una solución simple (después de horas de investigaciones):

Ejemplo de problema: Si usa diseño automático y establece la altura de la etiqueta UILabel para que sea proporcional a la altura de la pantalla, obtendrá un marco que es bajo para iPhone (horizontal) y alto para iPad. ¿Cómo ajustar la altura de la fuente automáticamente?

Solución: en el creador de interfaces,

  1. Establezca "Autoshrink "en"Tamaño de fuente mínimo" y establezca algo para el tamaño (afecta a textos demasiado anchos, pero necesarios para nuestra solución).
  2. Establece "Líneas" en 0, y haz que el tamaño de fuente sea más alto que el marco que obtendrás en el iPad.

Esto hará que la fuente se incremente automáticamente a la altura actual.

 14
Author: ishahak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-02 03:35:47

Puede lograr lo que desea configurando Autoshrink en su guion gráfico. Hará que la etiqueta se reduzca a una escala mínima/tamaño explícito cuando el tamaño de la pantalla se reduzca. Haga que funcione en el tamaño de pantalla más grande y luego asegúrese de que se reduzca al tamaño que desea en la vista previa del guion gráfico.

 2
Author: crow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-05 19:11:48

Puede reemplazar la clase en Interface Builder con su propia clase derivada y cambiar el tamaño allí.

Ejemplo:

/**
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink 
if the code is executed on an iPhone.
*/

class MYLabel: UILabel {

    var onlyOnceToken: dispatch_once_t = 0

    override func drawRect(rect: CGRect) {

        dispatch_once(&onlyOnceToken) {

            if let usedFont:UIFont = self.font {

                // define your reference size here
                let iPadHeight:CGFloat = 768
                let screenBounds = UIScreen.mainScreen().bounds
                let scale:CGFloat =  screenBounds.height / iPadHeight
                self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale)
            }
        }

        super.drawRect(rect)
    }
}

A partir de ahora solo necesita reemplazar la clase UILabel con myLabel en el inspector de identidad de IB y todas sus fuentes se redimensionan automáticamente proporcionalmente a la altura de sus dispositivos.

Si solo desea cultivarlo junto con el tamaño de la etiqueta, reemplace

let screenBounds = UIScreen.mainScreen().bounds

Con

let screenBounds = self.bounds.height

O cualquier otra escala personalizada fórmula. UIFont le ofrece propiedades de medición adicionales que puede hacer mucho con este enfoque.

 1
Author: JackPearse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-11 10:45:05

La fuente no crecerá automáticamente.
Debe aumentarlo/disminuirlo usted mismo, en IB o programáticamente.

 0
Author: Lior Pollak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-27 19:54:58