J'ai le code suivant...
UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
... l'idée étant que je peux avoir du texte sur plusieurs lignes pour le bouton, mais le texte est toujours obscurci par l'image d'arrière-plan du bouton UIButton. Un appel de journalisation pour afficher les sous-vues du bouton montre que le UILabel a été ajouté, mais le texte lui-même ne peut pas être vu. Est-ce un bug dans UIButton ou est-ce que je fais quelque chose de mal?
ios
cocoa-touch
uibutton
uikit
Owain Hunt
la source
la source
button.titleLabel?.numberOfLines = 0
Réponses:
Pour iOS 6 et supérieur, utilisez ce qui suit pour autoriser plusieurs lignes:
Pour iOS 5 et versions antérieures, utilisez ce qui suit pour autoriser plusieurs lignes:
2017, pour iOS9 en avant ,
généralement, faites simplement ces deux choses:
la source
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
NSLineBreakMode
, comme suit:button.titleLabel?.lineBreakMode = .ByWordWrapping
.La réponse sélectionnée est correcte mais si vous préférez faire ce genre de chose dans Interface Builder, vous pouvez le faire:
la source
titleLabel.textAlignment
avec laNumber
valeur1
inUser Defined Runtime Attributed
pour rendre le texte centréSi vous souhaitez ajouter un bouton avec le titre centré sur plusieurs lignes, définissez les paramètres de votre Interface Builder pour le bouton:
[ ]
la source
Pour IOS 6:
Comme
sont obsolètes dans IOS 6 et suivants.
la source
NSText.h
de laFoundation
il n'y a pas dépréciée ajouté. Son disponible à partir de 6.0 mais pas obsolète.button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
Pour reformuler la suggestion de Roger Nolan, mais avec un code explicite, voici la solution générale:
la source
SWIFT 3
la source
Dans Xcode 9.3, vous pouvez le faire en utilisant le storyboard comme ci-dessous,
Vous devez définir le texte du titre du bouton Alignement au centre
button.titleLabel?.textAlignment = .center
Vous n'avez pas besoin de définir le texte du titre avec une nouvelle ligne (\ n) comme ci-dessous,
button.setTitle("Good\nAnswer",for: .normal)
Définissez simplement le titre,
button.setTitle("Good Answer",for: .normal)
Voici le résultat,
la source
myButton.titleLabel.textAlignment = NSTextAlignmentCenter
est également nécessaire.Il existe un moyen beaucoup plus simple:
(Modifier pour iOS 3 et versions ultérieures :)
la source
Alignement à gauche sur iOS7 avec mise en page automatique:
la source
J'ai eu un problème avec la mise en page automatique, après avoir activé plusieurs lignes, le résultat était le suivant: la taille n'affecte donc pas la taille du bouton que j'ai ajouté
titleLabel
Constraints
sur la basecontentEdgeInsets
(dans ce contentEdgeInsets de cas était (10, 10, 10, 10 )après avoir appelé
makeMultiLineSupport()
: j'espère que cela vous aidera (swift 5.0):la source
Tout d'abord, vous devez savoir que UIButton a déjà un UILabel à l'intérieur. Vous pouvez le définir à l'aide de
–setTitle:forState:
.Le problème avec votre exemple est que vous devez définir la
numberOfLines
propriété UILabel sur autre chose que sa valeur par défaut de 1. Vous devez également revoir lalineBreakMode
propriété.la source
Pour ceux qui utilisent le storyboard de Xcode 4, vous pouvez cliquer sur le bouton, et dans le volet droit des utilitaires sous Inspecteur d'attributs, vous verrez une option pour le saut de ligne. Choisissez Word Wrap, et vous devriez être prêt à partir.
la source
Les réponses ici vous expliquent comment obtenir un titre de bouton multiligne par programmation.
Je voulais juste ajouter que si vous utilisez des storyboards, vous pouvez taper [Ctrl + Entrée] pour forcer une nouvelle ligne sur un champ de titre de bouton.
HTH
la source
Vous devez ajouter ce code:
la source
Quant à l'idée de Brent de mettre le titre UILabel en vue de frère, elle ne me semble pas être une très bonne idée. Je continue de penser aux problèmes d'interaction avec l'UILabel en raison de ses événements tactiles qui ne passent pas par la vue de l'UIButton.
D'un autre côté, avec un UILabel comme sous-vue du bouton UIButton, je suis assez à l'aise de savoir que les événements tactiles seront toujours propagés à la vue d'ensemble de l'UILabel.
J'ai adopté cette approche et je n'ai remarqué aucun des problèmes signalés avec backgroundImage. J'ai ajouté ce code dans le -titleRectForContentRect: d'une sous-classe UIButton mais le code peut également être placé dans la routine de dessin de la vue d'ensemble UIButton, qui dans ce cas vous devrez remplacer toutes les références à self par la variable UIButton.
J'ai pris le temps et j'ai écrit un peu plus à ce sujet ici . Là, je pointe également une solution plus courte, même si elle ne correspond pas tout à fait à tous les scénarios et implique le piratage de certaines vues privées. Vous pouvez également télécharger une sous-classe UIButton prête à être utilisée.
la source
Si vous utilisez la mise en page automatique sur iOS 6, vous devrez peut-être également définir la
preferredMaxLayoutWidth
propriété:la source
La définition de lineBreakMode sur NSLineBreakByWordWrapping (en IB ou en code) rend l'étiquette de bouton multiligne, mais n'affecte pas le cadre du bouton.
Si le bouton a un titre dynamique, il y a une astuce: mettre UILabel caché avec la même police et lier sa hauteur à la hauteur du bouton avec la mise en page; lorsque le texte est défini sur le bouton et l'étiquette et la mise en page automatique fera tout le travail.
Remarque
La taille de la taille intrinsèque du bouton d'une ligne est plus grande que celle de l'étiquette, donc pour empêcher la hauteur de l'étiquette de rétrécir, la priorité de l'étirement du contenu vertical doit être supérieure à la résistance de compression du contenu vertical du bouton.
la source
Dans Swift 5.0 et Xcode 10.2
Dans votre appel ViewController comme celui-ci
la source
Swift 5, pour le texte multi-lignes dans UIButton
la source
Cela fonctionne parfaitement.
Ajoutez à utiliser cela avec un fichier de configuration comme Plist, vous devez utiliser CDATA pour écrire le titre multiligne, comme ceci:
la source
Si vous utilisez la mise en page automatique.
la source
rapide 4.0
la source
De nos jours, si vous avez vraiment besoin que ce genre de chose soit accessible au cas par cas dans le constructeur d'interface, vous pouvez le faire avec une simple extension comme celle-ci:
Ensuite, vous pouvez simplement définir numberOfLines comme attribut sur n'importe quelle sous-classe UIButton ou UIButton comme s'il s'agissait d'une étiquette. Il en va de même pour toute une série d'autres valeurs généralement inaccessibles, telles que le rayon d'angle du calque d'une vue ou les attributs de l'ombre qu'elle projette.
la source
Lancez votre propre classe de boutons. C'est de loin la meilleure solution à long terme. UIButton et d'autres classes UIKit sont très restrictives dans la façon dont vous pouvez les personnaliser.
la source
la source
J'ai intégré la réponse de jessecurry dans STAButton qui fait partie de ma bibliothèque open source STAControls . Je l'utilise actuellement dans l'une des applications que je développe et cela fonctionne pour mes besoins. N'hésitez pas à ouvrir des problèmes sur la façon de l'améliorer ou à m'envoyer des demandes d'extraction.
la source
Pour fixer l'espacement de l'étiquette de titre au bouton, définissez titleEdgeInsets et d'autres propriétés avant setTitle:
PS J'ai testé la définition de titleLabel? .TextAlignment n'est pas nécessaire et le titre s'aligne
.natural
.la source
Bien qu'il soit correct d'ajouter une sous-vue à un contrôle, il n'y a aucune garantie que cela fonctionnera réellement, car le contrôle pourrait ne pas s'attendre à ce qu'il soit là et pourrait donc se comporter mal. Si vous pouvez vous en sortir, ajoutez simplement l'étiquette en tant que vue jumelle du bouton et définissez son cadre de sorte qu'il chevauche le bouton; tant qu'il est configuré pour apparaître en haut du bouton, rien de ce que le bouton peut faire ne l'obscurcira.
En d'autres termes:
la source
addSubview:
l'ajoute ici àbutton
la vue d'ensemble de, ce qui en fait un frère du bouton, donc faire correspondre leurs centres est correct.