Est-il possible d'ajuster la position x, y pour titleLabel de UIButton?

121

Est-il possible d'ajuster la position x, y pour le titleLabelde a UIButton?

Voici mon code:

    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
la source
1
Veuillez choisir l'autre réponse afin que nous puissions supprimer la réponse très négative. Ou expliquez pourquoi vous avez fait cela.
tchrist
1
Pourquoi cette réponse n'est-elle pas acceptée?
Antonio MG

Réponses:

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

Et dans 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
la source
3
c'est certainement la meilleure réponse
greenisus
3
Je me demande pourquoi le demandeur a choisi l'autre réponse. Celui-ci est bien meilleur.
Joshua
4
Je n'avais même pas besoin des deux premières lignes ... setTitleEdgeInsets:c'était tout ce que j'ai trouvé nécessaire pour déplacer le texte.
ArtOfWarfare
C'est certainement correct, mais probablement plus facile à réaliser en utilisant le constructeur d'interface (comme décrit dans ma réponse).
eladleb
Les deux premières lignes positionnent votre texte sur 0,0 (x, y). Cela peut empêcher un positionnement relatif; surtout si vous définissez l'alignement par défaut dans le fichier xib.
Jarrett Barnett
40

Le moyen le plus simple de le faire visuellement est d'utiliser l'inspecteur d'attributs ** (apparaît lors de l'édition d'un xib / storyboard), de définir la propriété " edge " sur title, d'ajuster ses incrustations, puis de définir la propriété "edge" sur l'image et de l'ajuster en conséquence . C'est généralement mieux que de le coder, car il est plus facile à maintenir et très visuel.

Paramètre de l'inspecteur d'attributs

eladleb
la source
1
Bon conseil au changement Edgede Titlepuis ajuster encart!
Dean
Pour référence future, depuis Xcode 8, au lieu de définir la edgepropriété, vous pouvez ajuster les encarts de titre dans l'inspecteur de taille.
dbmrq
14

Dérivez d'UIButton et implémentez la méthode suivante:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Éditer:

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

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end
dessiné
la source
Merci, c'est ce dont j'avais réellement besoin. Le centrage automatique ne suffisait pas.
dmzza le
4

Pour mes projets, j'ai cet utilitaire d'extension:

extension UIButton {

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

}
Luca Davanzo
la source