Vous pouvez résoudre ce problème sans avoir à surcharger des méthodes ou à définir une contrainte de largeur arbitraire. Vous pouvez le faire dans Interface Builder comme suit.
-
La largeur intrinsèque du bouton est dérivée de la largeur du titre, de la largeur de l'icône, de la gauche et de la droite. contenu inserts de bord.
-
Si un bouton comporte à la fois une image et du texte, ils sont centrés en tant que groupe, sans remplissage entre eux.
-
Si vous ajoutez un encart de contenu à gauche, il est calculé par rapport au texte, et non par rapport au texte + icône.
-
Si vous définissez une insertion négative de l'image à gauche, l'image est tirée vers la gauche mais la largeur globale du bouton n'est pas affectée.
-
Si vous définissez une insertion négative de l'image à gauche, la mise en page réelle utilise la moitié de cette valeur. Ainsi, pour obtenir une insertion gauche de -20 points, vous devez utiliser une valeur d'insertion gauche de -40 points dans Interface Builder.
Il faut donc prévoir un encart de contenu de gauche suffisamment grand pour créer un espace pour l'encart de gauche souhaité. et le remplissage intérieur entre l'icône et le texte, puis décalez l'icône vers la gauche en doublant la quantité de remplissage que vous souhaitez entre l'icône et le texte. Le résultat est un bouton avec des insertions de contenu égales à gauche et à droite, et une paire de texte et d'icône centrée en tant que groupe, avec une quantité spécifique de remplissage entre eux.
Quelques exemples de valeurs :
// Produces a button with the layout:
// |-20-icon-10-text-20-|
// AutoLayout intrinsic width works as you'd desire.
button.contentEdgeInsets = UIEdgeInsetsMake(10, 30, 10, 20)
button.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)
3 votes
Avez-vous déposé ce dossier comme un radar ? Il semble bien qu'il s'agisse d'un bogue dans les calculs de la taille intrinsèque de l'UIButton.
1 votes
J'étais prêt à déposer un radar, mais cela semble en fait être un comportement attendu. Ceci est documenté sur *EdgeInsets de UIButton propriétés : " Les inserts que vous spécifiez sont appliqués au rectangle de titre après que ce rectangle a été dimensionné pour s'adapter au texte du bouton. Ainsi, des valeurs d'insertion positives peuvent effectivement couper le texte du titre. [...] Le bouton n'utilise pas cette propriété pour déterminer intrinsicContentSize et sizeThatFits :."
8 votes
@GuillaumeAlgis Je dirais que bien que ce soit un comportement déclaré, c'est no pas du tout ce à quoi on pourrait s'attendre en utilisant autolayout. J'ai signalé un bogue et j'encourage les autres à en signaler un également.
0 votes
Si vous pouvez mettre un lien vers le bug du radar ici, pouvons-nous cliquer dessus et faire +1 ?
1 votes
From
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 l'insertion, vous forcez le bouton à couper le texte, c'est certain.0 votes
Je suggère de ne pas utiliser le bouton à des fins d'interface utilisateur. Une approche pizza de UIView avec UIlabel et un bouton transparent par-dessus donne beaucoup plus de flexibilité.