web-dev-qa-db-fra.com

UIButton avec deux lignes de texte dans le titre (numberOfLines = 2)

J'essaie de créer un UIButton qui a deux lignes de texte dans son intitulé label. C'est le code que j'utilise:

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    [titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
    titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleButton.titleLabel.numberOfLines = 2;
    [self addSubview:titleButton];

Quand j'essaye ceci, le texte apparaît seulement sur une ligne. Il semble que la seule façon d'obtenir plus d'une ligne de texte dans UIButton.titleLabel consiste à définir numberOfLines=0 et à utiliser UILineBreakModeWordWrap. Mais cela ne garantit pas que le texte a exactement deux lignes.

Utiliser un UILabel simple, cependant, fonctionne:

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
    titleLabel.numberOfLines = 2;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    [self addSubview:titleLabel];

Est-ce que quelqu'un sait comment faire fonctionner le UIButton avec deux lignes? La seule solution est-elle de créer un UILabel séparé pour contenir le texte et de l'ajouter en tant que sous-vue du bouton?

76
marketer

Réponse mise à jour pour les versions iOS les plus récentes

Puisqu'il s'agit de la réponse acceptée, a ajouté la réponse de @ Sean ici:

Définissez ces propriétés sur le label de titre de votre bouton.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0

Swift 3 et 4:

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0

Réponse originale pour une ancienne version d'iOS

Si vous voulez 2 lignes de texte au-dessus de votre UIButton, vous devez ajouter un UIlabel dessus, qui fait précisément cela.

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[myButton addSubview:titleLabel]; //add label to button instead.

Mise à jour pour solution d'interface builder

La réponse de @Borut Tomazin a été ajoutée pour une réponse plus complète . Cette partie a été mise à jour à nouveau depuis l'amélioration de la réponse de @Borut Tomazin.

Vous pouvez le faire beaucoup plus facilement, sans code requis. Dans Interface Builder, définissez Line Break sur UIButton sur Word Wrap. Que vous pouvez insérer plusieurs lignes de titre. Appuyez simplement sur les touches Option + Return pour créer une nouvelle ligne. Vous devrez également ajouter ceci à l'attribut d'exécution défini par l'utilisateur dans Interface Builder:

titleLabel.textAlignment Number [1]
71
Totumus Maximus

Vous n'avez pas besoin d'ajouter un UILabel à UIButton. Ce ne sont que des objets supplémentaires et du travail.

Définissez ces propriétés sur le label de titre de votre bouton.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0

Rapide:

button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0
145
Sean

Vous pouvez le faire beaucoup plus facilement, sans code requis. Dans Interface Builder, définissez Line Break sur UIButton sur Word Wrap. Que vous pouvez insérer plusieurs lignes de titre. Appuyez simplement sur les touches Option + Return pour créer une nouvelle ligne. Vous devrez également ajouter ceci à l'attribut d'exécution défini par l'utilisateur dans Interface Builder:

titleLabel.textAlignment Number [1]

C'est si simple. J'espère que ça aide...

86
Borut Tomazin
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
19
Suraj K Thomas

Pour éviter complètement le besoin de modifier le code, et donc le besoin de sous-classer votre vue, dans Xcode5 et versions supérieures, vous pouvez suivre la suggestion de Borut Tomazin:

Dans Interface Builder (ou storyboard), définissez le saut de ligne sur Word Wrap. Que vous pouvez insérer plusieurs lignes de titre. Il suffit de frapper Option + Return clés pour faire une nouvelle ligne.

et ensuite, dans le Attributs d'exécution définis par l'utilisateur vous pouvez ajouter

Chemin de la clé: titleLabel.textAlignment
Type: Number
Valeur: 1

Remarque: il se peut que cela ne soit pas tout à fait "pérenne" car nous traduisons la constante UITextAlignmentCenter en sa valeur numérique (et que cette constante peut changer à mesure que de nouvelles versions iOS sont publiées), mais cela semble sûr. le proche avenir.

9
furins

Vous pouvez modifier la valeur requise directement depuis Storyboard . Sélectionnez le bouton, accédez à l'inspecteur d'identité et ajoutez la paire clé-valeur suivante dans la section "Attributs d'exécution définis par l'utilisateur":

 enter image description here

0
Arik Segal