Je ne veux pas utiliser une sous-vue si je peux l'éviter. Je veux un UIButton
avec une image d'arrière-plan, du texte et une image. En ce moment, quand je fais cela, l'image est sur le côté gauche du texte. L'image d'arrière-plan, le texte et l'image ont tous des états de surbrillance différents.
ios
user-interface
layout
uibutton
jasongregori
la source
la source
Réponses:
Bien que certaines des réponses suggérées soient très créatives et extrêmement intelligentes, la solution la plus simple est la suivante:
Aussi simple que cela. En prime, l'image sera sur le côté gauche dans les endroits de droite à gauche.
EDIT : comme la question a été posée plusieurs fois, il s'agit d' iOS 9 + .
la source
semanticContentAttribute
n'est qu'un hack / contournement, pas une vraie solution.Solution la plus simple:
iOS 10 et plus, Swift:
Avant iOS 10, Swift / Obj-C:
la source
button.ImageEdgeInsets = new UIEdgeInsets(0, -leftPadding, 0, leftPadding); button.ContentEdgeInsets = new UIEdgeInsets(0, 0, 0, leftPadding);
. C'est dans Xamarin, mais devrait se traduire assez facilement en Swift / Obj-C.Il existe un moyen plus simple à partir du générateur d'interface .
Sélectionnez le bouton UIB et sélectionnez cette option dans Afficher les utilitaires> Sémantique :
C'est tout! Agréable et simple!
Si vous souhaitez ajuster l'espacement entre l'image et le titre, vous pouvez modifier l' encart d'image ici:
J'espère que cela pourra aider!
la source
Le sous-classement UIButton est totalement inutile. Au lieu de cela, vous pouvez simplement définir une valeur d'encart gauche élevée pour les encarts d'image et une petite encart de droite pour le titre. Quelque chose comme ça:
la source
Je donne à Inspire48 le mérite de celui-ci. Sur la base de sa suggestion et en regardant cette autre question, je suis venu avec cela. Sous-classe UIButton et remplacez ces méthodes.
la source
buttonWithType
If you subclass UIButton, this method does not return an instance of your subclass. If you want to create an instance of a specific subclass, you must alloc/init the button directly
et lesbackgroundRectForBounds
sous-classes qui fournissent des ornements d'arrière-plan personnalisés peuvent remplacer cette méthode et renvoyer un rectangle de limites modifié pour empêcher le bouton de dessiner sur tout contenu personnalisé. » méthodes, mais je suppose qu'ils ne se soucient pas des sous-classes.frame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(frame) - self.imageEdgeInsets.right + self.imageEdgeInsets.left - frame.origin.x;
Cela fonctionne mieux pourUIControlContentHorizontalAlignmentCenter
et pour les autres ...Mettez simplement à jour les encarts lorsque le titre est modifié. Vous devez compenser l'encart avec un encart égal et opposé de l'autre côté.
la source
[thebutton.titleLabel sizeToFit];
avant. La largeur peut être nulle si vous n'avez pas déclenché de mise en page. Il en va de même pour la taille de l'image (utilisez simplement la taille UIImage.size au lieu de la taille imageView)titleWidth = [self.titleLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height)].width;
(ou si vous êtes préoccupé par le fait que le cadre du bouton n'est pas encore établi, utilisez également CGFLOAT_MAX pour la hauteur) etimageWidth = self.currentImage.size.width;
layoutSubviews
maUITableViewCell
sous - classe mais ça marche bien. Merci!Toutes ces réponses, en date de janvier 2016, sont inutiles. Dans Interface Builder, définissez la vue sémantique sur
Force Right-to-Left
, ou si vous préférez la méthode de programmation,semanticContentAttribute = .forceRightToLeft
cela fera apparaître l'image à droite de votre texte.la source
UIBarButtonItem(customView: button)
, mais cela fonctionnera si vous placez le bouton dans une vue videDans le générateur d'interface, vous pouvez configurer les options Edge Insets pour UIButton, séparément chacune des trois parties: contenu, image, titre
Xcode 8:
la source
Mise à jour: Swift 3
Réponse originale pour Swift 2:
Une solution qui gère tous les alignements horizontaux, avec un exemple d'implémentation Swift. Traduisez simplement en Objective-C si nécessaire.
Il convient également de noter qu'il gère assez bien les encarts d'image et de titre.
Inspiré de la réponse jasongregori;)
la source
@IBDesignable
à la classe et la voir inversée au moment du design.Si cela doit être fait dans UIBarButtonItem , un habillage supplémentaire en vue doit être utilisé.
Cela fonctionnera
Ça ne marchera pas
la source
Voici une solution pour le
UIButton
contenu aligné au centre. Ce code rend l'image alignée à droite et permet d'utiliserimageEdgeInsets
ettitleEdgeInsets
pour un positionnement précieux.Sous-classe
UIButton
avec votre classe personnalisée et ajoutez:la source
Étant donné que la solution de transformation ne fonctionne pas dans iOS 11, j'ai décidé d'écrire une nouvelle approche.
Réglage des boutons
semanticContentAttribute
nous donne l'image bien à droite sans avoir à relayer si le texte change. Pour cette raison, c'est la solution idéale. Cependant, j'ai toujours besoin du support RTL. Le fait qu'une application ne puisse pas changer son sens de mise en page dans la même session résout facilement ce problème.Cela dit, c'est assez simple.
la source
Voie d'extension
Utiliser l'extension pour définir l'image sur le côté droit avec un décalage personnalisé
la source
Swift -Extend the UiButton et mettez ces lignes
la source
S'appuyant sur la solution élégante de Piotr Tomasik: si vous souhaitez également avoir un peu d' espacement entre l'étiquette du bouton et l'image , incluez-la dans vos encarts de bord comme suit (en copiant mon code ici qui fonctionne parfaitement pour moi):
Merci Piotr pour votre solution!
Erik
la source
Faites-vous. Xcode10, swift4,
Pour la conception d'interface utilisateur par programmation
pour la conception de l'interface utilisateur de StoryBoard
la source
Sous-classement et disposition dominante Les sous-vues sont probablement votre meilleure solution.
Référencé depuis: iPhone UIButton - position de l'image
la source
A pris la réponse de @ Piotr et en a fait une extension Swift. Assurez-vous de définir l'image et le titre avant d'appeler cela, afin que le bouton taille correctement.
}
la source
Une option rapide qui fait ce que vous voulez sans jouer avec des encarts:
la source
Les solutions mentionnées ici ont cessé de fonctionner, une fois que j'ai activé la disposition automatique . Je devais trouver le mien:
Sous-classe UIButton et
layoutSubviews
méthode de remplacement :Résultat:
la source
swift 3.0 Migration solution proposée par jasongregori
la source
J'ai décidé de ne pas utiliser la vue d'image de bouton standard car les solutions proposées pour le déplacer semblaient floues. Cela m'a donné l'esthétique souhaitée, et il est intuitif de repositionner le bouton en changeant les contraintes:
la source
Swift 3:
la source
Et les contraintes? Contrairement à semanticContentAttribute, ils ne changent pas la sémantique. Quelque chose comme ça peut-être:
ou en Objectif-C:
Mises en garde: non testé, iOS 9+
la source
Pour aligner à droite l'image dans UIButton, essayez le code ci-dessous
la source
Après avoir essayé plusieurs solutions sur Internet, je n'atteignais pas l'exigence exacte. J'ai donc fini par écrire du code utilitaire personnalisé. Affichage pour aider quelqu'un à l'avenir. Testé sur swift 4.2
la source
pour ce problème, vous pouvez créer UIView à l'intérieur de "étiquette avec vue UIImage" et définir la classe UIView comme UIControl et créer IBAction comme tuch up in side
la source
Swift 4 et 5
Changer la direction de l'image UIButton (RTL et LTR)
la source
Utility
?Xcode 11.4 Swift 5.2
Pour ceux qui essaient de refléter le style du bouton Retour avec le chevron comme ceci:
La mise en oeuvre:
la source
J'ai fini par créer un bouton personnalisé, qui permet de définir l'image à partir de l'inspecteur. Voici mon code:
Vous pouvez ajuster la valeur du remplissage de l'espace à partir de l'inspecteur pour ajuster l'espacement entre le texte et l'image.
PS: utilisé une partie de code de la réponse @Mark Hennings
la source