Dans le générateur d'interface, maintenir Command+ =redimensionnera un bouton pour l'adapter à son texte. Je me demandais si cela était possible de le faire par programme avant que le bouton ne soit ajouté à la vue.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Réponses:
Dans Xcode 4.5 et supérieur, cela peut maintenant être fait en utilisant ' Auto-layouting / Constraints '.
Les principaux avantages sont les suivants:
Quelques inconvénients:
La chose la plus cool est que nous nous concentrons sur la déclaration d'une intention telle que:
Voici un tutoriel simple pour vous familiariser avec la mise en page automatique.
Pour plus de détails .
Cela prend du temps au début, mais il semble que cela en vaudra la peine.
la source
Dans UIKit, il existe des ajouts à la classe NSString pour obtenir à partir d'un objet NSString donné la taille qu'il prendra lors du rendu dans une certaine police.
Docs était là . Maintenant, c'est ici sous Obsolète.
Bref, si vous y allez:
... vous aurez défini le cadre du bouton sur la hauteur et la largeur de la chaîne que vous rendez.
Vous voudrez probablement expérimenter avec un espace tampon autour de cette CGSize, mais vous commencerez au bon endroit.
la source
La façon de faire cela dans le code est:
Si vous effectuez un sous-classement et souhaitez ajouter des règles supplémentaires, vous pouvez remplacer:
la source
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
De même, si vous mettez à jour le texte plus tard, n'oubliez pas de le rappeler.sizeToFit()
ne respecte pas les encarts de bord de titre.Si votre bouton a été créé avec Interface Builder et que vous modifiez le titre dans le code, vous pouvez le faire:
la source
Rapide:
La chose importante ici est de savoir quand appellerez-vous le
.sizeToFit()
, cela devrait être après avoir défini le texte à afficher pour qu'il puisse lire la taille nécessaire, si vous mettez à jour le texte plus tard, appelez-le à nouveau.la source
Pour ce faire à l'aide de la disposition automatique, essayez de définir une contrainte de largeur variable:
Vous devrez peut-être également ajuster votre
Content Hugging Priority
etContent Compression Resistance Priority
pour obtenir les résultats dont vous avez besoin.UILabel est auto-dimensionnant complètement :
Cet UILabel est simplement paramétré pour être centré sur l'écran (deux contraintes uniquement, horizontale / verticale):
Il change de largeur de manière totalement automatique:
Vous n'avez pas besoin de définir de largeur ou de hauteur - c'est totalement automatique.
Notez que les petits carrés jaunes sont simplement attachés ("espacement" de zéro). Ils se déplacent automatiquement lorsque le UILabel se redimensionne.
L'ajout d'une contrainte "> =" définit une largeur minimale pour le UILabel:
la source
Si vous souhaitez redimensionner le texte par opposition au bouton, vous pouvez utiliser ...
la source
sizeToFit ne fonctionne pas correctement. au lieu:
vous pouvez également ajouter
contentInset
au bouton:myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
la source
Simplement:
UIView
comme wrapper avec une disposition automatique pour les vues autour.UILabel
dans cet emballage. Ajoutez des contraintes qui colleront votre étiquette aux bords de l'emballage.UIButton
intérieur de votre wrapper, puis ajoutez simplement les mêmes contraintes que celles pour lesquelles vous l'avez faitUILabel
.la source
Swift 4.2
Dieu merci, cela est résolu. Après avoir défini un texte sur le bouton, vous pouvez récupérer intrinsicContentSize qui est la taille naturelle d'un UIView (le document officiel est ici ). Pour UIButton, vous pouvez l'utiliser comme ci-dessous.
Pour votre information, j'ai ajusté la largeur pour qu'elle soit correcte.
Simulateur
UIButtons avec intrinsicContentSize
Source: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
la source
J'ai quelques besoins supplémentaires liés à ce poste qui
sizeToFit
ne résout pas. J'avais besoin de garder le bouton centré dans son emplacement d'origine, quel que soit le texte. Je ne veux pas non plus que le bouton soit plus grand que sa taille d'origine.Donc, je dispose le bouton pour sa taille maximale, enregistre cette taille dans le contrôleur et utilise la méthode suivante pour dimensionner le bouton lorsque le texte change:
la source
Cette classe de bouton avec redimensionnement automatique de la hauteur pour le texte (pour Xamarin mais peut être réécrite pour une autre langue)
la source
Pour une raison quelconque,
func sizeToFit()
ne fonctionne pas pour moi. Ma configuration est que j'utilise un bouton dans unUITableViewCell
et que j'utilise la mise en page automatique.Ce qui a fonctionné pour moi, c'est:
intrinsicContentSize
largeur, car selon la mise en page automatique de ce document, il n'est pas conscient de laintrinsicContentSize
. Définissez la contrainte de largeur sur laintrinsicContentSize
largeurVoici deux titres du
Debug View Hierachry
la source
Pour être honnête, je pense que c'est vraiment dommage qu'il n'y ait pas de simple case à cocher dans le storyboard pour dire que vous voulez redimensionner les boutons pour accueillir le texte. Bien, peu importe.
Voici la solution la plus simple utilisant le storyboard.
Placez UILabel dans UIView. Définissez des contraintes pour l'attacher aux bords de UIView.
Placez votre UIButton dans UIView. Définissez les mêmes contraintes pour l'attacher aux bords de UIView.
Définissez 0 pour le nombre de lignes d'UILabel.
Installez les points de vente.
la source