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.