2011-12-14 9 views
15

Sé cómo establecer la alineación vertical de un botón con IB; ver here. Pero no puedo hacerlo mediante programación ... Esta es una de las cosas que he intentado:¿Cómo puedo establecer programáticamente la alineación vertical de un UIButton? IOS

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 110, 130)]; 
[button setTitle:@"Align" forState:UIControlStateNormal]; 
button.backgroundColor = [UIColor whiteColor]; 
button.titleLabel.textColor = [UIColor grayColor]; 
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom]; 

[self.view addSubview:button]; 

[button release]; 

También he intentado inserciones ...

pero la alineación no va a cambiar.

Tenga en cuenta que quiero mantener el estilo personalizado del botón (no quiero el aspecto y la sensación predeterminados).

Respuesta

1

El problema fue la usando

button.titleLabel.textColor = [UIColor grayColor]; 

en lugar de

[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 

En otra parte de mi código sigo teniendo problemas alinear verticalmente el texto, pero tengo la ejemplo básico, así que debería poder obtener la versión más complicada si la veo más. Tal vez hay otros métodos que estoy usando como button.titleLabel.textColor que hacen que la alineación vertical no funciona ...

Actualizar El problema original era en realidad porque mi botón era demasiado corto (altura botón).

The word `husband' is in the button

La palabra husband está en el botón, que está actualmente alineado verticalmente a la parte inferior. Pero como la altura del botón no es suficiente, no es obvio. Aunque el valor predeterminado de las opciones de título e inserciones de contenido es cero, no parece que el título esté alineado con la parte inferior. Me parecen unos 5 píxeles. Probé con una fuente más pequeña para asegurarme de que esto sea correcto.

Desafortunadamente alinear verticalmente el texto a la parte superior no parece cambiar nada ...

9

contentVerticalAlignment es el camino a seguir. Podría ser cómo estás creando el botón. Prueba esto:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
button.frame = CGRectMake(10, 10, 110, 130); 
// rest of your code 
// don't release button explicitly 
+0

+1 por responder a mi pregunta 100%. Pero no te daré el tic porque no leíste mi opinión ... Perdón, debería haber especificado la pregunta mejor. También quiero mantener el tipo personalizado. Voy a modificar mi pregunta para reflejar eso. Te daré el tic si no llegan mejores respuestas. Aclamaciones. –

+0

Curiosamente, esto dejará de funcionar cuando (incorrectamente) cambie el color de la fuente accediendo a titleLabel (en lugar de enviar el mensaje setTitleColor) –

+0

Esto puede no tener nada que ver con el problema pero aún debe usar 'buttonWithType' para crear el botón . Cualquier tipo es correcto, incluido 'buttonWithType: UIButtonTypeCustom'. – XJones

1

Se puede manipular fácilmente la etiqueta de texto interno del UIButton. aquí cómo puede hacerlo:

  1. texto conjunto de botones para @ "" (cadena vacía)
  2. crear nueva UILabel y ajustar su marco
  3. inserto creado UILabel vista interior de los botones como subvista
  4. Es hecho. Ahora puede establecer programáticamente la posición de UILabel con cambiar su propiedad de marco.
18

Usted puede alineación (horizontal y vertical) el texto del botón de esta manera:

 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 70)]; 
     button.backgroundColor = [UIColor whiteColor]; 
     button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; 
     button.contentVerticalAlignment = UIControlContentVerticalAlignmentBottom; 
     [button setTitle:@"Align" forState:UIControlStateNormal]; 
     [self.container addSubview:button]; 
+0

Bueno, también podemos alinear la imagen del botón. –

0

he encontrado una mejor manera que a mí. Estoy usando una fuente personalizada por lo que la alineación se fue un poco por unos pocos como en lindon fox's respuesta arriba.

Dentro de ustedes UIButton subclase:

- (void)layoutSubviews { 

     [super layoutSubviews]; 

     if (UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, self.titleEdgeInsets)) { 

      // adjust top, left bottom, and right to fit your needs 
      self.titleEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right); 
     } 
} 

Estoy de acuerdo con las otras respuestas que utilizando el conjunto contentVerticalAlignment-UIControlContentVerticalAlignmentCenter es también una buena idea.

Cuestiones relacionadas