2011-02-10 11 views
14

Tengo un UIButton que quiero cambiar de tamaño para que se ajuste a cualquier texto que esté dentro de él. Tiene un ancho establecido de 280, pero el texto debe ajustarse a las siguientes líneas y extender la altura del botón según sea necesario.¿Cómo cambio el tamaño de un UIButton para que se ajuste al texto sin que sea más ancho que la pantalla?

He establecido saltos de línea a Word Wrap e intenté con sizeToFit pero eso solo hace que el botón se vuelva más ancho, no vertical.

Respuesta

2

me las arreglé para conseguir que funcione 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 utiliza esta Asegúrese de ajustar:

myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap; 
2

Es posible que desee mirar el UIKit Additions to NSString documentation que incluye métodos para la medición de fuente restringida a un ancho o tamaño de cuadro específico.

Cuando se establece el título del botón, se puede medir la cadena usando el sizeWithFont: forWidth: lineBreakMode: método, por ejemplo, y actualizar volvió marco de su botón en función del tamaño (posiblemente permitiendo algo de relleno alrededor de los bordes)

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

+0

Me guió en la dirección correcta ... gracias! – TigerCoding

31

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

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

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

+3

Funciona para mí. Gracias. – Prazi

+15

Creo que esto puede no funcionar correctamente en los botones con tipo = personalizado – marmor

5

[button sizeToFit] no funcionó para mí, pero he encontrado una manera de utilizar IB sola (Xcode 4.5):

  1. Haga clic en la UIButton
  2. en el arrastre Tamaño inspector de content hugging a 1 (tanto horizontal y vertical)
  3. arrastre compression resistance a 1000 (para ambos)
  4. debajo del UIButton constraints clic en Width y cambiar priority-250
  5. hacer lo mismo para Altura
  6. Puede utilizar el UIButton 's inset para controlar el relleno de izquierda/derecha/arriba/abajo
+0

¿Intentó utilizar el recuadro? Si utilizo el recuadro, parece que el diseño automático no tiene en cuenta el cálculo del ancho esperado, a pesar de que el ancho del botón aumenta, pero no es suficiente para acomodar texto + recuadro izquierdo – saurabh

0

que he tenido que hacer frente a un problema similar, tenía anchura limitada por mi botones y quería que crezcan verticalmente, dependiendo de la cantidad de texto que les daría. Terminé con una solución simple, basado en lo que he aprendido en la documentación de Apple (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html)

He subclases UIButton y 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 ciclo infinito), y cuando el sistema solicita el tamaño de contenido intrínseco, lo recalculo en función del ancho del botón. La altura extra de 20px es para relleno. He probado muchas otras maneras, pero desde mi diseño está todo basado en diseño automático, quería algo que yo no tengo que actualizar cada vez que el dispositivo gira más o menos. Esto simplemente funciona.

¡Buena suerte! Z.

Cuestiones relacionadas