Si j'ai un UIButton arrangé en utilisant la mise en page automatique, sa taille s'ajuste bien pour s'adapter à son contenu.
Si je mets une image en tant que button.image
, la taille intrinsèque semble à nouveau expliquer cela.
Cependant, si je modifie le titleEdgeInsets
bouton, la mise en page ne tient pas compte de cela et tronque le titre du bouton.
Comment puis-je m'assurer que la largeur intrinsèque du bouton représente l'encart?
Éditer:
J'utilise les éléments suivants:
[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
Le but est d'ajouter une certaine séparation entre l'image et le texte.
ios
cocoa-touch
uiview
uibutton
autolayout
Ben Packard
la source
la source
titleEdgeInset
documentation:The insets you specify are applied to the title rectangle after that rectangle has been sized to fit the button’s text. Thus, positive inset values may actually clip the title text.
Donc, en ajoutant un encart, vous forcez le bouton à couper le texte à coup sûrRéponses:
Vous pouvez résoudre ce problème sans avoir à remplacer les méthodes ou à définir une contrainte de largeur arbitraire. Vous pouvez tout faire dans Interface Builder comme suit.
La largeur intrinsèque du bouton est dérivée de la largeur du titre plus la largeur de l'icône plus les encarts de bord de contenu gauche et droit .
Si un bouton contient à la fois une image et du texte, ils sont centrés en groupe, sans aucun remplissage entre eux.
Si vous ajoutez un encart de contenu gauche, il est calculé par rapport au texte, pas au texte + icône.
Si vous définissez une incrustation d'image gauche négative, l'image est tirée vers la gauche mais la largeur globale du bouton n'est pas affectée.
Si vous définissez un encart d'image gauche négatif, la mise en page réelle utilise la moitié de cette valeur. Donc, pour obtenir un encart gauche de -20 points, vous devez utiliser une valeur d'encart gauche de -40 points dans Interface Builder.
Vous fournissez donc un encart de contenu gauche suffisamment grand pour créer de l'espace pour l'encart gauche souhaité et le remplissage intérieur entre l'icône et le texte, puis déplacez l'icône vers la gauche en doublant la quantité de remplissage souhaitée entre l'icône et le texte. Le résultat est un bouton avec des encarts de contenu égaux à gauche et à droite, et une paire de texte et d'icônes qui sont centrés en tant que groupe, avec une quantité spécifique de remplissage entre eux.
Quelques exemples de valeurs:
la source
UIButton
.Vous pouvez le faire fonctionner dans Interface Builder (sans écrire de code), en utilisant une combinaison de titres et de contenus négatifs et positifs.
Mise à jour : Xcode 7 a un bug où vous ne pouvez pas entrer de valeurs négatives dans le
Right
champ Encart, mais vous pouvez utiliser le contrôle pas à pas à côté de lui pour diminuer la valeur. (Merci Stuart)Faire cela ajoutera 8 pt d'espacement entre l'image et le titre et augmentera la largeur intrinsèque du bouton de la même quantité. Comme ça:
la source
Right
champ.Pourquoi ne pas remplacer la
intrinsicContentSize
méthode sur UIView? Par exemple:Cela devrait indiquer au système de mise en page automatique qu'il doit augmenter la taille du bouton pour permettre les encarts et afficher le texte intégral. Je ne suis pas sur mon propre ordinateur, je n'ai donc pas testé cela.
la source
intrinsicContentSize
est une méthode sur UIView, pas UIButton, donc vous ne feriez pas de bêtise avec les méthodes UIButton. Apple ne pense pas que ce soit un problème: "Remplacer cette méthode permet à une vue personnalisée de communiquer au système de mise en page quelle taille elle souhaite être basée sur son contenu." Et l'OP n'a rien dit sur les différents boutons, juste celui-là.intrinsicContentSize
est en effet une méthode sur UIView et UIButton est une sous-classe de UIView donc vous pouvez bien sûr remplacer cette méthode; rien dans les documents d'Apple ne dit que vous ne devriez pas. Créez simplement une sous-classe UIButton en utilisant la méthode substituée de Maarten et modifiez votre UIButton dans Interface Builder pour qu'il soit de type YourUIButtonSubclass et cela fonctionnera parfaitement.intrinsicContentSize
UIButton devrait ajouter dans le titleEdgeInsets, je vais déposer un bug avec Apple.Vous n'avez pas spécifié comment vous définissez les encarts, donc je suppose que vous utilisez titleEdgeInsets parce que je vois le même effet que vous obtenez. Si j'utilise contentEdgeInsets à la place, cela fonctionne correctement.
la source
Et pour Swift a travaillé ceci:
Love U Swift
la source
Ce fil est un peu ancien, mais je l'ai rencontré moi-même et j'ai pu le résoudre en utilisant un encart négatif. Par exemple, remplacez ici les valeurs de remplissage souhaitées:
Combiné avec les bonnes contraintes de mise en page automatique, vous vous retrouvez avec un bouton de redimensionnement automatique qui contient une image et du texte! Vu ci-dessous avec un
desiredLeftPadding
réglage sur 10.Vous pouvez voir que le cadre réel du bouton ne comprend pas l'étiquette (puisque l'étiquette est décalée de 10 points vers la droite, en dehors des limites), mais nous avons atteint 10 points de remplissage entre le texte et l'image.
la source
Pour Swift 3 basé sur la réponse de pegpeg :
la source
Tout ce qui précède ne fonctionnait pas pour iOS 9+ , ce que j'ai fait est:
Maintenant, pour ajouter une bordure autour du bouton, utilisez simplement la méthode:
la source
Je voulais ajouter un espace de 5 points entre mon icône UIButton et l'étiquette. Voici comment je l'ai réalisé:
La façon dont contentEdgeInsets, titleEdgeInsets et imageEdgeInsets se rapportent les uns aux autres nécessite un peu de compromis de chaque encart. Donc, si vous ajoutez des encarts à gauche du titre, vous devez ajouter un encart négatif à droite et fournir plus d'espace (via un encart positif) à droite du contenu.
En ajoutant une insertion de contenu à droite pour correspondre au décalage des insertions de titre, mon texte ne sort pas des limites du bouton.
la source
L'option est également disponible dans le générateur d'interface. Voir l'encart. J'ai mis à gauche et à droite à 3. Fonctionne comme un charme.
la source
La solution que j'utilise est d'ajouter une contrainte de largeur sur le bouton. Puis quelque part dans l'initialisation, une fois votre texte défini, mettez à jour la contrainte de largeur comme suit:
self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;
Où 8 correspond à votre encart.
la source
constant
la contrainte de la nouvelle valeur ... et savoir quand la taille du contenu intrinsèque du bouton change est difficile sans sous-classer le bouton.setNeedsUpdateConstraints
peut être effectué "manuellement" après la mise à jour du titre ou de l'image du bouton. Vous pouvez ensuite remplacerupdateConstraints
et recalculerbuttonWidthConstraint
la constante de à partir de là. Ce n'est pas nécessairement la meilleure approche mais cela fonctionne assez bien pour moi. YMMV;)l'appel de sizeToFit () garantit que contentEdgeInset est pris en compte
la source