ios - settitle - swift button action
iOS: cambio de tamaño de UIButton según la longitud del texto (10)
En el constructor de interfaz, mantener presionado Command + = cambiará el tamaño de un botón para que se ajuste a su texto. Me preguntaba si esto era posible hacerlo programáticamente antes de agregar el botón a la vista.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
En UIKit, hay adiciones a la clase NSString para obtener de un objeto NSString determinado el tamaño que ocupará cuando se represente en una determinada fuente.
Documentos here .
En resumen, si vas:
CGSize stringsize = [myString sizeWithFont:[UIFont systemFontOfSize:14]];
//or whatever font you''re using
[button setFrame:CGRectMake(10,0,stringsize.width, stringsize.height)];
... habrá establecido el marco del botón a la altura y el ancho de la cadena que está representando.
Probablemente quieras experimentar con un espacio de búfer alrededor de ese CGSize, pero estarás comenzando en el lugar correcto.
En Xcode 4.5 y versiones superiores, esto ahora se puede hacer usando '' Diseño automático / Restricciones ''.
Las principales ventajas son:
- ¡No necesita configurar marcos en absoluto!
- Si lo hace bien, no necesita preocuparse por restablecer marcos para cambios de orientación.
- Además, los cambios en el dispositivo no deben molestarlo (lea, no es necesario codificar por separado para diferentes tamaños de pantalla).
Algunas desventajas:
- No compatible con versiones anteriores: funciona solo para iOS 6 y versiones posteriores.
- Necesita familiarizarse (pero ahorrará tiempo más adelante).
La cosa más genial es que nos concentremos en declarar un intento como:
- Quiero que estos dos botones tengan el mismo ancho; o
- Necesito que esta vista se centre verticalmente y se extienda a un máximo de 10 pts desde el borde de la supervista; o incluso,
- ¡Quiero que este botón / etiqueta cambie de tamaño de acuerdo con la etiqueta que se muestra!
Here hay un tutorial simple para introducirse en el diseño automático.
Para más detalles .
Al principio, lleva un tiempo, pero parece que valdrá la pena el esfuerzo.
La forma de hacer esto en el código es:
[button sizeToFit];
Si está creando subclases y desea agregar reglas adicionales, puede anularlas:
- (CGSize)sizeThatFits:(CGSize)size;
Para lograr esto utilizando el diseño automático, intente configurar una restricción de ancho variable:
Es posible que también deba ajustar su Content Hugging Priority
Content Compression Resistance Priority
y Content Compression Resistance Priority
para obtener los resultados que necesita.
UILabel se auto-dimensiona completamente automáticamente :
Este UILabel simplemente está configurado para centrarse en la pantalla (dos restricciones solamente, horizontal / vertical):
Cambia los anchos de forma totalmente automática:
No es necesario establecer ningún ancho o alto, es totalmente automático.
Observe que los pequeños cuadrados amarillos están simplemente unidos ("espaciado" de cero). Se mueven automáticamente a medida que el UILabel cambia de tamaño.
Agregar una restricción "> =" establece un ancho mínimo para UILabel:
Si desea cambiar el tamaño del texto en lugar del botón, puede usar ...
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.minimumScaleFactor = .5;
// The .5 value means that I will let it go down to half the original font size
// before the texts gets truncated
// note, if using anything pre ios6, you would use I think
button.titleLabel.minimumFontSize = 8;
Si su botón se creó con Interface Builder y está cambiando el título en el código, puede hacer esto:
[self.button setTitle:@"Button Title" forState:UIControlStateNormal];
[self.button sizeToFit];
Simplemente:
- Cree
UIView
como contenedor con diseño automático para las vistas. - Ponga
UILabel
dentro de ese envoltorio. Agregue restricciones que pegarán la etiqueta de tyour a los bordes de la envoltura. - Ponga
UIButton
dentro de su contenedor, luego simplemente agregue las mismas restricciones queUILabel
paraUILabel
. - Disfruta de tu botón de auto-tamaño junto con el texto.
Tengo algunas necesidades adicionales relacionadas con esta publicación que sizeToFit
no resuelve. Necesitaba mantener el botón centrado en su ubicación original, independientemente del texto. Tampoco quiero que el botón sea más grande que su tamaño original.
Entonces, diseño el botón para su tamaño máximo, guardo ese tamaño en el Controlador y uso el siguiente método para ajustar el tamaño del botón cuando el texto cambia:
+ (void) sizeButtonToText:(UIButton *)button availableSize:(CGSize)availableSize padding:(UIEdgeInsets)padding {
CGRect boundsForText = button.frame;
// Measures string
CGSize stringSize = [button.titleLabel.text sizeWithFont:button.titleLabel.font];
stringSize.width = MIN(stringSize.width + padding.left + padding.right, availableSize.width);
// Center''s location of button
boundsForText.origin.x += (boundsForText.size.width - stringSize.width) / 2;
boundsForText.size.width = stringSize.width;
[button setFrame:boundsForText];
}
sizeToFit no funciona correctamente. en lugar:
myButton.size = myButton..sizeThatFits(CGSize.zero)
también puede agregar contentInset
al botón:
myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
Rápido:
Lo importante aquí es cuándo llamarás a .sizeToFit()
, después de configurar el texto para que pueda leer el tamaño necesario, si luego actualizas el texto, y luego volver a llamarlo.
var button = UIButton()
button.setTitle("Length of this text determines size", forState: UIControlState.Normal)
button.sizeToFit()
self.view.addSubview(button)