É possível ajustar a posição x, y para titleLabel de UIButton?

121

É possível ajustar a posição x, y para a titleLabelde a UIButton?

Aqui está o meu 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
fonte
1
Por favor, escolha a outra resposta para que possamos excluir a muito negativa. Ou então explique por que você fez isso.
tchrist
1
Por que essa resposta não é aceita?
Antonio MG

Respostas:

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)];

E em 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)

Swift 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)
cannyboy
fonte
3
esta é definitivamente a melhor resposta
greenisus
3
Eu me pergunto por que o autor da pergunta escolheu a outra resposta. Este é muito melhor.
Joshua
4
Eu nem precisava das duas primeiras linhas ... setTitleEdgeInsets:foi tudo o que achei necessário para mudar o texto.
ArtOfWarfare
Definitivamente, isso está correto, mas provavelmente será mais fácil de usar usando o construtor de interface (conforme descrito na minha resposta).
Eladleb
As duas primeiras linhas posicionam seu texto em 0,0 (x, y). Isso pode impedir o posicionamento relativo; especialmente se você definir o alinhamento padrão no xib.
Jarrett Barnett
40

A maneira mais fácil de fazer isso visualmente é usar o inspetor de atributos ** (aparece ao editar um xib / storyboard), definindo a propriedade " edge " para o título, ajustando as inserções, definindo a propriedade "edge" para a imagem e ajustando de acordo . Geralmente é melhor do que codificá-lo, pois é mais fácil de manter e altamente visual.

Configuração do Inspetor de Atributos

eladleb
fonte
1
Boa dica para a mudança Edgepara Titlee ajuste de inserção!
Dean
Para referência futura, desde o Xcode 8, em vez de definir a edgepropriedade, você pode ajustar as inserções de título no Inspetor de tamanhos.
dbmrq
14

Derive do UIButton e implemente o seguinte 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
desenhado
fonte
Obrigado, é disso que eu realmente precisava. A centralização automática não foi suficiente.
dmzza
4

Para meus projetos, tenho este utilitário de extensão:

extension UIButton {

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

}
Luca Davanzo
fonte