Je voudrais placer une icône à gauche des deux lignes de texte de sorte qu'il y ait environ 2-3 pixels d'espace entre l'image et le début du texte. Le contrôle lui-même est aligné au centre horizontalement (défini via Interface Builder)
Le bouton ressemblerait à quelque chose comme ceci:
| |
|[Image] Add To |
| Favorites |
J'essaie de configurer cela avec contentEdgeInset, imageEdgeInsets et titleEdgeInsets en vain. Je comprends qu'une valeur négative élargit le bord tandis qu'une valeur positive le rétrécit pour le rapprocher du centre.
J'ai essayé:
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];
mais cela ne l'affiche pas correctement. J'ai modifié les valeurs, mais passer de -5 à -10 sur la valeur de l'encart de gauche ne semble pas la déplacer de la manière attendue. -10 va parcourir le texte complètement à gauche, donc je m'attendais à ce que -5 le fasse à mi-chemin du côté gauche, mais ce n'est pas le cas.
Quelle est la logique derrière les encarts? Je ne connais pas les emplacements d'image et la terminologie associée.
J'ai utilisé cette question SO comme référence, mais quelque chose à propos de mes valeurs n'est pas correct. UIButton: comment centrer une image et un texte en utilisant imageEdgeInsets et titleEdgeInsets?
[UIButton setTitleColor:forState:]
, ni même[UIButton setTitle:forState:]
.Je suis un peu en retard à cette fête, mais je pense que j'ai quelque chose d'utile à ajouter.
La réponse de Kekoa est excellente mais, comme le mentionne RonLugge, cela peut rendre le bouton plus respectueux
sizeToFit
ou, plus important encore, provoquer le bouton pour couper son contenu lorsqu'il est intrinsèquement dimensionné. Oui!Mais d'abord,
Une brève explication de la façon dont je crois
imageEdgeInsets
ettitleEdgeInsets
travaille:Les documents pour
imageEdgeInsets
ont ce qui suit à dire, en partie:Je crois que cette documentation a été écrite en imaginant que le bouton n'a pas de titre, juste une image. Il est beaucoup plus logique de penser de cette façon et se comporte comme d'
UIEdgeInsets
habitude. Fondamentalement, le cadre de l'image (ou le titre, avectitleEdgeInsets
) est déplacé vers l'intérieur pour les encarts positifs et vers l'extérieur pour les encarts négatifs.Okay, alors quoi?
J'y arrive! Voici ce que vous avez par défaut, en définissant une image et un titre (la bordure du bouton est verte juste pour montrer où elle est):
Lorsque vous souhaitez un espacement entre une image et un titre, sans provoquer l’écrasement de l’un ou l’autre, vous devez définir quatre encarts différents, deux sur l’image et le titre. C'est parce que vous ne voulez pas changer la taille des cadres de ces éléments, mais simplement leur position. Lorsque vous commencez à penser de cette façon, le changement nécessaire à l'excellente catégorie de Kekoa devient clair:
Mais attendez , vous dites, quand je fais ça, je reçois ceci:
Oh oui! J'ai oublié, les docs m'ont prévenu à ce sujet. Ils disent, en partie:
Mais il y a une propriété qui peut aider, et c'est
contentEdgeInsets
. Les documents pour cela disent, en partie:Ça sonne bien. Alors, ajustons la catégorie une fois de plus:
Et qu'obtenez-vous?
On dirait un gagnant pour moi.
Vous travaillez chez Swift et vous ne voulez pas réfléchir du tout? Voici la version finale de l'extension dans Swift:
la source
intrinsicContentSize
erreur, ce qui est très important en ces jours de mise en page automatique depuis que la réponse originale a été acceptée.spacing
à chacune des quatre valeurs de self.contentEdgeInsets, comme ceci:self.contentEdgeInsets = UIEdgeInsetsMake(spacing, spacing + insetAmount, spacing, spacing + insetAmount);
Dans l'interface Builder. Sélectionnez le bouton UIButton -> Inspector Attributes -> Edge = Title et modifiez les encarts de bord
la source
Aussi, si vous voulez faire quelque chose de similaire à
Vous avez besoin
1.Définissez l'alignement horizontal et vertical pour que le bouton
Trouver toutes les valeurs requises et définir
UIImageEdgeInsets
Cela organisera votre titre et votre image sur le bouton.
Veuillez également noter la mise à jour sur chaque relais
Rapide
la source
Vous pouvez éviter beaucoup de problèmes en utilisant ceci -
Cela alignera automatiquement tout votre contenu à gauche (ou où vous le souhaitez)
Swift 3:
la source
Dans Xcode 8.0, vous pouvez simplement le faire en modifiant
insets
inspecteur de taille.Sélectionnez le bouton UIB -> Inspecteur d'attributs -> allez à l'inspecteur de taille et modifiez le contenu, l'image et les encarts de titre.
Et si vous voulez changer l'image sur le côté droit, vous pouvez simplement changer la propriété sémantique
Force Right-to-left
dans l'inspecteur d'attributs.la source
Je suis un peu en retard à cette soirée aussi, mais je pense que j'ai quelque chose d'utile à ajouter: o).
J'ai créé un
UIButton
sous classe dont le but est de pouvoir choisir la disposition de l'image du bouton, verticalement ou horizontalement.Cela signifie que vous pouvez créer ce type de boutons:
Voici les détails sur la façon de créer ces boutons avec ma classe:
Pour ce faire, j'ai ajouté 2 attributs:
imageVerticalAlignment
etimageHorizontalAlignment
. Bien sûr, si votre bouton n'a qu'une image ou un titre ... n'utilisez pas du tout cette classe!J'ai également ajouté un attribut nommé
imageToTitleSpacing
qui vous permet d'ajuster l'espace entre le titre et l'image.Cette classe fait de son mieux pour être compatible si vous voulez l'utiliser
imageEdgeInsets
,titleEdgeInsets
etcontentEdgeInsets
directement ou en combinaison avec les nouveaux attributs de mise en page.Comme @ravron nous l'explique, je fais de mon mieux pour rendre le bord du contenu du bouton correct (comme vous pouvez le voir avec les bordures rouges).
Vous pouvez également l'utiliser dans Interface Builder:
Voici le code ( gist ):
la source
error: IB Designables: Failed to update auto layout status: The agent crashed
, gist.github.com/nebiros/ecf69ff9cb90568edde071386c6c4ddberror: IB Designables: Failed to update auto layout status: The agent crashed
parce que ceinit(frame: CGRect)
n'était pas surchargé, aussi, j'ajoute une@available
annotation…, vous pouvezdiff -Naur
si vous voulez, ;-)Un petit ajout à la réponse de Riley Avron aux changements de paramètres régionaux du compte:
la source
Swift 4.x
Utilisation :
la source
J'écris du code bewlow. Cela fonctionne bien dans la version du produit. Supprot Swift 4.2 +
la source
Voici un exemple simple de la façon d'utiliser imageEdgeInsets Cela rendra un bouton 30x30 avec une zone pouvant être frappée 10 pixels plus grand tout autour (50x50)
la source
Une manière élégante dans Swift 3 et mieux comprendre:
la source
La version rapide de la solution 4.2 serait la suivante:
la source