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 = ???

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)

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


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

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
    }

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.