¿Es posible ajustar la posición x, y para titleLabel of UIButton?


121

¿Es posible ajustar la posición x, y para el titleLabelde a UIButton?

Aquí está mi código:

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    [btn setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i+1] forState:UIControlStateNormal];     
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    btn.titleLabel.frame = ???

1
Elija la otra respuesta para que podamos eliminar la muy negativa. O bien, explique por qué ha hecho esto.
— tchrist

1
¿Por qué no se acepta esa respuesta?
— Antonio MG

Respuestas:


445
//make the buttons content appear in the top-left
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentTop];

//move text 10 pixels down and right
[button setTitleEdgeInsets:UIEdgeInsetsMake(10.0f, 10.0f, 0.0f, 0.0f)];

Y en Swift

//make the buttons content appear in the top-left
button.contentHorizontalAlignment = .Left
button.contentVerticalAlignment = .Top

//move text 10 pixels down and right
button.titleEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 0.0, 0.0)

Rápido 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)

3
esta es definitivamente la mejor respuesta
— greenisus

3
Me pregunto por qué el autor de la pregunta eligió la otra respuesta. Este es mucho mejor.
— Joshua

4
Ni siquiera necesitaba las dos primeras líneas ... setTitleEdgeInsets:fue todo lo que encontré necesario para cambiar el texto.
— ArtOfWarfare

Esto es definitivamente correcto, pero probablemente más fácil de lograr usando el generador de interfaces (como se describe en mi respuesta).
— eladleb

Las primeras dos líneas colocan su texto en 0,0 (x, y). Esto puede evitar el posicionamiento relativo; especialmente si establece la alineación predeterminada en el xib.
— Jarrett Barnett

40

La forma más fácil de hacerlo visualmente es usar el inspector de atributos ** (aparece al editar un xib / storyboard), establecer la propiedad " edge " en el título, ajustar sus inserciones, luego configurar la propiedad "edge" en la imagen y ajustar en consecuencia . Suele ser mejor que codificarlo, ya que es más fácil de mantener y muy visual.

Configuración del inspector de atributos


1
Un buen consejo para el cambio Edgea Titley luego ajustar inserción!
— Dean

Para referencia futura, desde Xcode 8, en lugar de establecer la edgepropiedad, puede ajustar las inserciones del título en el Inspector de tamaño.
— dbmrq

14

Derive de UIButton e implemente el siguiente método:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Editar:

@interface PositionTitleButton : UIButton
@property (nonatomic) CGPoint titleOrigin;
@end

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end

Gracias, esto es lo que realmente necesitaba. El centrado automático no fue suficiente.
— dmzza

4

Para mis proyectos tengo esta utilidad de extensión:

extension UIButton {

    func moveTitle(horizontal hOffset: CGFloat, vertical vOffset: CGFloat) {
        self.titleEdgeInsets.left += hOffset
        self.titleEdgeInsets.top += vOffset
    }

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.