web-dev-qa-db-fra.com

Comment définir par programme l'alignement vertical d'un UIButton - iOS

Je sais comment définir l'alignement vertical d'un bouton avec IB; voir ici . Mais je ne peux pas le faire par programme ... C’est l’une des choses que j’ai essayée:

UIButton *button  = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 110, 130)];
[button setTitle:@"Align" forState:UIControlStateNormal];
button.backgroundColor = [UIColor whiteColor];
button.titleLabel.textColor = [UIColor grayColor];
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];

[self.view addSubview:button];

[button release];

J'ai aussi essayé des incrustations ...

Mais l'alignement ne changera pas.

Veuillez noter que je souhaite conserver le CustomStyle du bouton (je ne souhaite pas l'apparence par défaut).

16
lindon fox

Le problème était l'utilisation 

button.titleLabel.textColor = [UIColor grayColor];

au lieu de 

[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

Ailleurs dans mon code, j'ai toujours du mal à aligner verticalement le texte, mais j'ai l'exemple de base, alors je devrais pouvoir obtenir la version plus compliquée si je l'examine plus en détail. Peut-être y a-t-il d'autres méthodes que j'utilise, comme button.titleLabel.textColor, qui empêchent l'alignement vertical de fonctionner ...

Mise à jour Le problème initial était en réalité dû au fait que mon bouton était trop court (hauteur du bouton).

The Word `husband' is in the button

Le mot husband est dans le bouton, qui est actuellement aligné verticalement vers le bas. Mais comme la hauteur du bouton ne suffit pas, cela n’est pas évident. Même si les valeurs par défaut des encarts de titre et de contenu sont égales à zéro, il ne semble pas que le titre puisse être aligné contre le bas. Cela ressemble à environ 5 pixels pour moi. J'ai testé avec une police plus petite pour m'assurer que cela est correct.

Malheureusement, aligner verticalement le texte en haut ne semble rien changer ...

1
lindon fox

Vous pouvez aligner (horizontalement et verticalement) le texte du bouton de la manière suivante:

        UIButton *button  = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 70)];
        button.backgroundColor = [UIColor whiteColor];
        button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        button.contentVerticalAlignment = UIControlContentVerticalAlignmentBottom;
        [button setTitle:@"Align" forState:UIControlStateNormal];
        [self.container addSubview:button];
20

contentVerticalAlignment est la voie à suivre. Peut-être que vous créez le bouton. Essaye ça:

 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 button.frame = CGRectMake(10, 10, 110, 130);
 // rest of your code
 // don't release button explicitly
9
XJones

Vous pouvez facilement manipuler l'étiquette de texte interne de UIButton. Voici comment vous pouvez le faire:

  1. mettre le texte des boutons à @ "" (chaîne vide) 
  2. créer un nouveau UILabel et ajuster son cadre 
  3. insérer UILabel créé dans la vue des boutons en tant que sous-vue 
  4. C'est fait. Vous pouvez maintenant définir par programme la position de UILabel intérieur en modifiant sa propriété frame.
1
Dmitriy Lezhnev

J'ai trouvé un meilleur moyen qui fonctionne pour moi. J'utilise une police personnalisée donc l'alignement a été légèrement modifié, comme dans lindon fox's answer ci-dessus.

À l'intérieur de votre sous-classe UIButton:

- (void)layoutSubviews {

      [super layoutSubviews];

      if (UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, self.titleEdgeInsets)) {

            // adjust top, left bottom, and right to fit your needs
            self.titleEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
      }
}

Je suis d’accord avec les autres réponses selon lesquelles l’utilisation du paramètre contentVerticalAlignment sur UIControlContentVerticalAlignmentCenter est également une bonne idée.

0
cynistersix