¿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.