ios - semana - Haga crecer la fuente junto con UILabel(redimensionado por Auto Layout)-¿Cómo hacerlo en Interface Builder?
hacer crecer barba lampiño (5)
La fuente no crecerá automáticamente.
Debe aumentarlo / disminuirlo usted mismo, en IB o mediante programación.
En una aplicación de iPhone simple, UIView
un mosaico de letras ( UIView
personalizado con una imagen y 2 etiquetas) con el siguiente código en viewDidLoad :
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 DraggedTile.xib
"Auto Layout".
Luego, para la image
y la letter
agrego restricciones a los bordes izquierdo, superior, derecho, inferior del padre.
Para la etiqueta de la letter
también puse "Líneas" en 0 y "Prioridad de resistencia de compresión de contenido" en 1000 (aquí en pantalla completa 1 y pantalla completa 2 ):
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:
Tanto la image
fondo como la etiqueta de la letter
parecen haber crecido según lo previsto.
Sin embargo, el tamaño de fuente de la etiqueta no ha crecido.
He buscado y creo que necesito algo como tile.letter.adjustsFontSizeToFitWidth = YES
. Pero al mismo tiempo no puedo usarlo con "Auto Layout" activado ...
¿Entonces mi pregunta es si hay alguna opción en el "Generador de Interfaz" disponible para hacer que el tamaño de la fuente también crezca?
ACTUALIZAR:
He intentado la sugerencia de ismailgulek para establecer el tamaño de fuente en 200 en Interface Builder y viewDidLoad tile.letter.adjustsFontSizeToFitWidth = YES
y parece prometedor (aquí en fullscreen ):
pero ahora tengo el problema de haber establecido 40px como la restricción letter.bottom
en Interface Builder. ¿Pero qué pasa si necesito un marco de baldosas más grande? ¿Hay una manera de usar el porcentaje en lugar del valor absoluto de píxeles en esa restricción?
Y otra pregunta es si es posible configurar el adjustsFontSizeToFitWidth
en algún lugar del Interface Builder o ¿tengo que usar el código fuente para eso? He intentado agregar una clave a los "Atributos de tiempo de ejecución definidos por el usuario", pero luego la aplicación se bloquea en el tiempo de ejecución:
Para aquellos que vienen aquí por el título y necesitan una solución simple (después de horas de investigación):
Ejemplo de problema: si usa el diseño automático y configura la altura de 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 Interface Builder,
- Establezca "Autoshrink" en "Tamaño de fuente mínimo" y establezca algo para el tamaño (afecta a los textos demasiado anchos, pero es necesario para nuestra solución).
- Establezca "Líneas" en 0 , y haga que el tamaño de la fuente sea más alto que el marco que obtendrá en el iPad .
Esto hará que la fuente se incremente automáticamente a la altura actual.
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 debe reemplazar la clase UILabel con MYLabel en el inspector de identidad de IB y todas sus fuentes se redimensionarán automáticamente proporcionalmente a la altura de sus dispositivos.
Si solo quieres crecer junto con el tamaño de la etiqueta, reemplaza
let screenBounds = UIScreen.mainScreen().bounds
con
let screenBounds = self.bounds.height
o cualquier otra fórmula a escala personalizada. UIFont le ofrece propiedades de medición adicionales que puede hacer mucho con este enfoque.
Puedes lograr lo que quieras configurando Autoshrink en tu guión gráfico. Esto hará que la etiqueta se reduzca a una escala mínima / tamaño explícito cuando el tamaño de la pantalla sea más pequeño. Haz que funcione en el tamaño de pantalla más grande y luego asegúrate de que se reduzca al tamaño que deseas en la vista previa del guión gráfico.
adjustsFontSizeToFitWidth
propiedad de UILabel
no aumentará el tamaño de la fuente, solo se reducirá de acuerdo con la documentación: Normalmente, el texto de la etiqueta se dibuja con la font
que especifique en la propiedad de la fuente. Sin embargo, si esta propiedad se establece en YES
y el texto en la propiedad de texto excede el rectángulo delimitador de la etiqueta, el receptor comienza a reducir el tamaño de la fuente hasta que la cadena se ajuste o se alcance el tamaño de fuente mínimo.
Pero si establece el tamaño de fuente lo suficientemente grande (por ejemplo, 200) y ajusta el adjustsFontSizeToFitWidth
en YES
, creo que obtendría resultados interesantes y valiosos.
Y no olvide establecer la Baseline
como Align Centers
, de lo contrario, es posible que su texto no se vea correctamente.
Por favor infórmenos sobre sus resultados.