J'essaie de créer un bouton qui a du texte sous l'icône (un peu comme les boutons de l'application), mais cela semble assez difficile à réaliser. Des idées comment puis-je obtenir le texte à afficher sous l'image avec un UIButton
?
158
https://github.com/albert-zhang/AZCenterLabelButton
( Lien )Réponses:
Ou vous pouvez simplement utiliser cette catégorie:
ObjC
Extension Swift
Suggestion: si la hauteur du bouton est inférieure à
totalHeight
, l'image dessinera les bordures extérieures.imageEdgeInset.top
devrait être:la source
CGRectGetHeight()
etCGRectGetWidth()
lors de l'obtention de la hauteur et de la largeur d'imageView et titleLabel.CGFloat inset = (self.frame.size.height - totalHeight)/2; self.contentEdgeInsets = UIEdgeInsetsMake(inset, 0.0f, inset, 0.0f);
Dans Xcode, vous pouvez simplement définir l'encart de titre du bord gauche pour négatif la largeur de l'image. Cela affichera l'étiquette au centre de l'image.
Pour que l'étiquette s'affiche sous l'image (un peu comme les boutons de l'application), vous devrez peut-être définir l'encart supérieur du titre Edge sur un nombre positif.
la source
Il s'agit d'un simple bouton de titre centré implémenté dans Swift en remplaçant
titleRect(forContentRect:)
etimageRect(forContentRect:)
. Il implémente égalementintrinsicContentSize
pour une utilisation avec AutoLayout.la source
Regardez cette excellente réponse dans Swift.
la source
left
dansimageEdgeInsets
avec(self.frame.size.width - imageSize.width) / 2
layoutSubviews()
votre supervision.Sous-classe
UIButton
. Override -layoutSubviews
pour déplacer le intégrésubviews
dans de nouvelles positions:la source
titleRectForContentRect
etimageRectForContentRect
Réponse de icecrystal23 refactorisée.
Swift 3, fonctionne avec les mises en page automatiques, xib, les storyboards, peut être animé.
Le bouton dans la réponse originale de icecrystal23 avait un cadre mal calculé. Je pense que j'ai réglé ça.
Edit: mis à jour vers Swift 5 et fait fonctionner dans Interface Builder / Storyboards
la source
corrigé une des réponses ici:
Swift 3:
la source
Ceci est une version modifiée de l'excellente réponse d'Erik W. Mais au lieu de placer l'image centrée en HAUT de la vue, il place l'image et l'étiquette centrées dans la vue en tant que groupe.
La différence est:
contre
Source ci-dessous:
FYI: Cela peut casser lorsqu'il est combiné avec des animations UIView, car layoutSubviews est appelé pendant celles-ci.
la source
La solution de Dave dans Swift:
la source
Si vous sous
UIButton
- classez etoverride layoutSubviews
, vous pouvez utiliser ce qui suit pour centrer l'image et placer le titre centré en dessous:kTextTopPadding
est une constante que vous devrez introduire qui détermine l'espace entre l'image et le texte en dessous.la source
Mise à jour de la réponse de Kenny Winker depuis que sizeWithFont est obsolète dans iOS 7.
la source
Sur iOS 11 / Swift 4, aucune des réponses ci-dessus n'a vraiment fonctionné pour moi. J'ai trouvé quelques exemples et j'ai mis mon tour dessus:
J'espère que cela aide quelqu'un.
la source
En utilisant le code de Kenny Winker et Simeon, je crée ce code rapide qui fonctionne pour moi.
la source
Il vous suffit d'ajuster les trois encarts de bord en fonction de la taille de votre image et de l'étiquette de titre:
Vous pouvez obtenir les limites de l'étiquette de titre en appelant sizeToFit après avoir défini son texte. L'espacement horizontal devrait fonctionner quelle que soit la taille du texte, de la police et de l'image, mais je ne connais pas de solution unique pour obtenir la cohérence de l'espacement vertical et du bord inférieur du contenu.
la source
Voici la réponse de "Bear With Me" en tant que sous-classe dans
Swift 2.0
. Pour l' utiliser il suffit de changer votre classe de boutonInterface Builder
pourVerticalButton
et comme par magie à jour l'aperçu.Je l'ai également mis à jour pour calculer la taille de contenu intrinsèque correcte pour la mise en page automatique.
la source
layoutSubviews()
est appelé à plusieurs reprises dans mon cas:intrinsicContentSize
accèsimageView
qui faitlayoutSubviews
être appelé qui accèdeimageView
etc.@Tiago je change ta réponse comme ça. Cela fonctionne bien avec toutes les tailles
la source
J'ai pris une combinaison des réponses ici et en ai trouvé une qui semble fonctionner pour moi, à Swift. Je n'aime pas la façon dont je viens de remplacer les inserts, mais cela fonctionne. Je serais ouvert aux améliorations suggérées dans les commentaires. Il semble fonctionner correctement avec
sizeToFit()
et avec la mise en page automatique.la source
Utilisez ces deux méthodes:
Exemple:
Et vous pouvez utiliser:
la source
Swift 5 - la méthode ci-dessous fonctionne pour moi
Assurez-vous que le titre de votre bouton n'est pas tronqué dans le storyboard / xib sinon passez à la
solution 2
la source
Je pense que l'un des meilleurs moyens de le faire est de sous-classer UIButton et de remplacer certaines méthodes de rendu:
la source
J'ai trouvé que la réponse de Simeon était probablement la meilleure, mais cela me donnait des résultats étranges sur certains boutons et je ne pouvais tout simplement pas comprendre pourquoi. Donc, en utilisant sa réponse comme base, j'ai implémenté mes boutons comme ci-dessous:
la source
Voici ma sous-classe
UIButton
qui résout ce problème:C'est tout. Fonctionne comme du charme. Un problème peut survenir si le bouton est trop petit pour s'adapter au titre et au texte.
la source
@ Syméon solution en Objective-C
la source
CGSizeMake(MAX(labelSize.width, image.size.width), image.size.height + labelSize.height + 5.0)
dans le cas siSi vous utilisez des polices personnalisées, le calcul de la taille de titleLabel ne fonctionnera pas correctement, vous devez le remplacer par
let titleLabelSize = self.titleLabel?.text?.size(withAttributes: [NSAttributedStringKey.font: self.titleLabel!.font!])
la source
Au lieu de traverser l'enfer en essayant de positionner l'icône et le texte avec des inserts de bord, vous pouvez créer un NSAttributedString avec votre image en tant que pièce jointe et le définir à la place sur le titre attribué à votre bouton:
la source
UIButton
mise en page de champ de texte de 1 pour afficher uniquement la ligne, il ne fonctionne pas donc même lorsque vous utilisez un saut de ligne dans la chaîne attribuée. Serait une bonne solution sinon.button.titleLabel?.numberOfLines
pour obtenir le nombre de lignes nécessaireSolution conviviale pour la localisation:
Tant de bonnes solutions, mais j'aimerais ajouter une note ici pour ceux qui utilisent la localisation.
Vous devez inverser les valeurs EdgeInstets gauche et droite pour que le bouton soit correctement disposé en cas de changement de direction de la langue de LtR à RtL.
En utilisant une solution similaire, je l'implémenterais comme suit:
la source
Image du haut et bouton de titre du bas avec UIButton de sous-classification
la source
C'est définitivement exagéré pour cette question, cependant ... Dans l'un de mes projets, j'ai d'abord dû implémenter un bouton avec l'icône alignée le plus à gauche. Ensuite, nous avons un autre bouton avec le titre sous l'image. J'ai cherché une solution existante mais sans chance Alors, voici le bouton alignable:
J'espère que vous le trouverez utile.
la source
Quelque chose comme ça dans la
UIButton
sous-classela source
C'est assez simple.
Au lieu de cela:
Utilisez ceci:
Ensuite, vous pouvez facilement ajouter du texte sur le bouton en utilisant:
// button.titleLabel! .font = UIFont (nom: "FontName", taille: 30)
la source