iphone uibutton

iphone - ¿Cómo cambio el tamaño de un UIButton para que se ajuste al texto sin que sea más ancho que la pantalla?



(5)

Asegúrese de configurar el texto en su botón de esta manera:

[myButton setTitle:@"my title" forState:UIControlStateNormal];

... y [myButton sizeToFit] deberían funcionar como un encanto.

Tengo un UIButton que quiero cambiar de tamaño para que se ajuste al texto que se encuentre dentro de él. Tiene un ancho establecido de 280, pero el texto debe ajustarse a la (s) siguiente (s) línea (s) y extender la altura del botón según sea necesario.

He establecido saltos de línea en Word Wrap y probé sizeToFit pero eso solo hace que el botón sea más ancho, no vertical.


Es posible que desee consultar la documentación de UIKit Additions to NSString , que incluye métodos para la medición de fuentes restringidas a un ancho o tamaño de caja específicos.

Cuando configura el título del botón, puede medir la cadena utilizando el método sizeWithFont: forWidth: lineBreakMode:, por ejemplo, y actualizar el marco de su botón según el tamaño devuelto (posiblemente permitiendo algo de relleno alrededor de los bordes).

Lo siento, no tengo un ejemplo específico para ti.


He estado enfrentando un problema similar, tenía un ancho limitado para mis botones y quería que crecieran verticalmente, dependiendo de la cantidad de texto que les daría. Terminé con una solución simple, basada en lo que he aprendido en los documentos de Apple ( https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html )

He subclasificado UIButton y he anulado dos funciones:

- (void)setBounds:(CGRect)bounds { if (!CGRectEqualToRect(bounds, self.bounds)) { [self invalidateIntrinsicContentSize]; } [super setBounds:bounds]; } - (CGSize)intrinsicContentSize { // CGSize size; self.titleLabel.frame = CGRectMake(self.titleLabel.frame.origin.x, self.titleLabel.frame.origin.y, self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right, 0); size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size]; size = CGSizeMake(size.width, size.height + 20); return size; }

Lo que básicamente sucede aquí es que el botón invalida su tamaño intrínseco (solo cuando los límites establecidos son realmente nuevos, esto es para evitar un bucle sin fin), y cuando el sistema solicita el tamaño del contenido intrínseco, recalculo eso en función del ancho del botón. La altura extra de 20px es para relleno. He intentado de muchas otras maneras, pero como mi diseño se basa en AutoLayout, quería algo que no tengo que actualizar siempre que el dispositivo gire. Esto simplemente funciona.

¡Buena suerte! Z.


Logré que funcionara en una categoría de UIButton:

@interface UIButton (ExpandsVertically) - (CGSize)sizeThatFits:(CGSize)size; @end @implementation UIButton (Expandable) - (CGSize)sizeThatFits:(CGSize)size { // for the width, I subtract 24 for the border // for the height, I use a large value that will be reduced when the size is returned from sizeWithFont CGSize tempSize = CGSizeMake(size.width - 24, 1000); CGSize stringSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font constrainedToSize:tempSize lineBreakMode:UILineBreakModeWordWrap]; return CGSizeMake(size.width - 24, stringSize.height); } @end

Si alguien usa esto, asegúrese de configurar:

myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;


[button sizeToFit] no funcionó para mí, pero he encontrado una forma de usar solo IB (xcode 4.5):

  1. Haga clic en el UIButton
  2. en el inspector de tamaño, arrastre el content hugging a 1 (tanto horizontal como vertical)
  3. resistencia de compression resistance arrastre a 1000 (para ambos)
  4. bajo las restricciones de UIButton, haga clic en Width y cambie la priority a 250
  5. Haz lo mismo con la altura.
  6. Puede usar el UIButton para controlar el relleno para izquierda / derecha / arriba / abajo