En el creador de interfaces, al mantener presionado Command+ se =cambiará el tamaño de un botón para que se ajuste a su texto. Me preguntaba si esto era posible hacerlo mediante programación 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];
Respuestas:
En Xcode 4.5 y versiones posteriores, esto ahora se puede hacer usando ' Diseño automático / Restricciones '.
Las principales ventajas son que:
Algunas desventajas:
Lo mejor es que podemos centrarnos en declarar una intención como:
Aquí hay un tutorial simple para iniciarse en el diseño automático.
Para más detalles .
Al principio lleva algo de tiempo, pero parece que valdrá la pena el esfuerzo.
fuente
En UIKit, hay adiciones a la clase NSString para obtener de un objeto NSString dado el tamaño que tomará cuando se represente en una fuente determinada.
Docs estuvo aquí . Ahora está aquí en desuso.
En resumen, si vas:
... habrá configurado el marco del botón a la altura y el ancho de la cadena que está renderizando.
Probablemente quiera experimentar con un poco de espacio de búfer alrededor de ese CGSize, pero comenzará en el lugar correcto.
fuente
La forma de hacer esto en código es:
Si está subclasificando y desea agregar reglas adicionales, puede anular:
fuente
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
Además, si actualiza el texto más tarde, no olvide volver a llamarlo.sizeToFit()
no respeta las inserciones del borde del título.Si su botón se creó con Interface Builder y está cambiando el título del código, puede hacer esto:
fuente
Rápido:
Lo importante aquí es cuándo llamarás al
.sizeToFit()
, debe ser después de configurar el texto para que se muestre para que pueda leer el tamaño necesario, si luego actualizas el texto, vuelve a llamarlo.fuente
Para lograr esto usando autolayout, intente establecer una restricción de ancho variable:
También es posible que necesite ajustar su
Content Hugging Priority
yContent Compression Resistance Priority
obtener los resultados que necesita.UILabel es completamente automático :
Este UILabel simplemente está configurado para centrarse en la pantalla (solo dos restricciones, 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 simplemente se unen ("espaciado" de cero). Se mueven automáticamente a medida que UILabel cambia de tamaño.
Agregar una restricción "> =" establece un ancho mínimo para UILabel:
fuente
Si desea cambiar el tamaño del texto en lugar del botón, puede usar ...
fuente
sizeToFit no funciona correctamente. en lugar:
También puedes agregar
contentInset
al botón:myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
fuente
Simplemente:
UIView
como envoltorio con diseño automático para vistas alrededor.UILabel
dentro de esa envoltura. Agregue restricciones que peguen su etiqueta a los bordes del contenedor.UIButton
dentro de su contenedor, luego simplemente agregue las mismas restricciones que lo hizo paraUILabel
.fuente
Swift 4.2
Gracias a Dios, esto está resuelto. Después de configurar un texto para el botón, puede recuperar intrinsicContentSize, que es el tamaño natural de una UIView (el documento oficial está aquí ). Para UIButton, puede usarlo como a continuación.
Para su información, ajusté el ancho para que se vea correctamente.
Simulador
Botones UIB con intrinsicContentSize
Fuente: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
fuente
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 cambiar el tamaño del botón cuando cambia el texto:
fuente
Esta clase de botón con altura de tamaño automático para texto (para Xamarin pero se puede reescribir para otro idioma)
fuente
Por alguna razón,
func sizeToFit()
no funciona para mí. Mi configuración es que estoy usando un botón dentro deUITableViewCell
ay estoy usando el diseño automático.Lo que funcionó para mí es:
intrinsicContentSize
ancho porque de acuerdo con este documento, el diseño automático no conoce elintrinsicContentSize
. Establecer la restricción deintrinsicContentSize
ancho al anchoAquí hay dos títulos de
Debug View Hierachry
fuente
Para ser sincero, creo que es realmente una pena que no haya una casilla de verificación simple en el guión gráfico para decir que desea cambiar el tamaño de los botones para acomodar el texto. Bueno lo que sea.
Aquí está la solución más simple usando storyboard.
Coloque UILabel dentro de UIView. Establezca restricciones para adjuntarlo a los bordes de UIView.
Coloque su UIButton dentro de UIView. Establezca las mismas restricciones para adjuntarlo a los bordes de UIView.
Establezca 0 para el número de líneas de UILabel.
Configurar los puntos de venta.
fuente