¿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 = ???
RAGOpoR
fuente
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)
cannyboy
fuente
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

eladleb
fuente
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
hacia adelante
fuente
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
    }

}
Luca Davanzo
fuente