J'ai un UIButton
texte avec "Explorez l'application" et UIImage
(>) Il Interface Builder
ressemble à:
[ (>) Explore the app ]
Mais je dois placer ceci UIImage
APRÈS le texte:
[ Explore the app (>) ]
Comment puis-je déplacer le UIImage
vers la droite?
ios
iphone
cocoa-touch
uibutton
imageedgeinsets
Pavel Yakimenko
la source
la source
Réponses:
Ma solution à cela est assez simple
la source
À partir d' iOS 9 , il semble qu'un moyen simple d'y parvenir soit de forcer la sémantique de la vue.
Ou par programmation, en utilisant:
la source
semanticContentAttribute
dans notre logique de mise en page, au lieu de se changersemanticContentAttribute
. (changement d'approche sémantique, ne fonctionnera pas bien avec l'internationalisation)Définissez
imageEdgeInset
ettitleEdgeInset
pour déplacer les composants dans votre image. Vous pouvez également créer un bouton en utilisant ces graphiques en taille réelle et l'utiliser comme image d'arrière-plan du bouton (puis utilisertitleEdgeInsets
pour déplacer le titre).la source
La réponse de Raymond W est la meilleure ici. Sous-classe UIButton avec layoutSubviews personnalisé. Extrêmement simple à faire, voici une implémentation de layoutSubviews qui a fonctionné pour moi:
la source
Qu'en est-il du sous
UIButton
-classement et du remplacementlayoutSubviews
?Puis post-traitement des emplacements de
self.imageView
&self.titleLabel
la source
Un autre moyen simple (qui n'est PAS iOS 9 uniquement) consiste à sous-classer UIButton pour remplacer ces deux méthodes
contentEdgeInsets
est déjà pris en compte en utilisant super.la source
Forcer «de droite à gauche» pour le bouton n'est pas une option si votre application prend en charge à la fois «de gauche à droite» et «de droite à gauche».
La solution qui a fonctionné pour moi est une sous-classe qui peut être ajoutée au bouton dans le Storyboard et fonctionne bien avec les contraintes (testé sous iOS 11):
Où «padding» serait l'espace entre le titre et l'image.
la source
.forceRightToLeft
c'est une option! Utilisez simplement la valeur opposée (.forceLeftToRight
) ifUIApplication.shared.userInterfaceLayoutDirection == .rightToLeft
.Dans Swift:
la source
Construire la réponse par @split ...
La réponse est fantastique, mais elle ignore le fait que le bouton peut avoir des incrustations d'image et de bord de titre personnalisées qui sont définies à l'avance (par exemple dans le storyboard).
Par exemple, vous voudrez peut-être que l'image ait un remplissage du haut et du bas du conteneur, mais déplacez toujours l'image vers le côté droit du bouton.
J'ai étendu le concept avec cette méthode: -
la source
Cela crée un bouton aligné à droite, comme ceci:
Le bouton n'ajuste pas sa largeur en fonction du contexte, de sorte que l'espace apparaîtra à gauche de l'étiquette. Vous pouvez résoudre ce problème en calculant la largeur du cadre du bouton à partir de buttonLabelSize.width et de buttonImageSize.width.
la source
la source
Cette solution fonctionne sous iOS 7 et supérieur
Juste sous-classe UIButton
Utilisation (quelque part dans votre classe):
la source
S'appuyant sur les réponses précédentes. Si vous voulez avoir une marge entre l'icône et le titre du bouton, le code doit changer un peu pour empêcher le flottement de l'étiquette et de l'icône au-dessus des limites des boutons de taille intrinsèque.
La dernière ligne de code est importante pour le calcul intrinsèque de la taille du contenu pour la mise en page automatique.
la source
Voici ma propre façon de faire la chose, (après environ 10 ans)
la source
Solution monoligne dans Swift:
la source