J'ai quelques UIButtons, et dans IB, ils sont réglés sur Aspect Fit, mais pour une raison quelconque, ils s'étirent toujours. Y a-t-il autre chose que vous devez définir? J'ai essayé tous les différents modes d'affichage et aucun d'eux ne fonctionne, ils s'étirent tous.
ios
iphone
uibutton
aspect-fit
Marty
la source
la source
Réponses:
J'ai déjà eu ce problème. Je l'ai résolu en plaçant mon image dans un
UIImageView
, où lescontentMode
paramètres fonctionnent réellement, et en mettant une personnalisation transparenteUIButton
par-dessus cela.EDIT: Cette réponse est obsolète. Voir la réponse de @Werner Altewischer pour la réponse correcte dans les versions modernes d'iOS.
la source
La solution consiste à définir le
contentMode
sur laimageView
propriété duUIButton
. LeUIButton
doit être créé avec un type personnalisé pour que cela fonctionne, je crois (sinon, ilnil
est retourné pour cette propriété).la source
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Cette méthode a très bien fonctionné pour moi:
Dans Xib, sélectionnez le bouton et réglez
user defined runtime attributes
:self.imageView.contentMode
Number
1
la source
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
travaillé pour moi!Si vous faites cela dans Interface Builder, vous pouvez utiliser l'inspecteur d'attributs d'exécution pour le définir directement sans aucun code.
Définissez votre chemin de clé sur le bouton pour qu'il soit "imageView.contentMode" avec un type de "Number" et une valeur de "1" (ou le mode de votre choix).
la source
Utilisez l'imageView du bouton pour contentMode. Pas directement sur le bouton lui-même.
la source
Si vous placez l'image dans un
UIImageView
derrière le bouton, vous perdrez la fonctionnalité intégrée de laUIButton
classe, telle queadjustsImageWhenHighlighted
etadjustsImageWhenDisabled
, et bien sûr la possibilité de définir différentes images pour différents états (sans avoir à le faire vous-même).Si nous voulons avoir une image non étirée pour tous les états de contrôle , une approche consiste à obtenir l'image en utilisant
imageWithCGImage:scale:orientation
, comme dans la méthode suivante:Pour implémenter cela, nous écririons:
Cela devrait empêcher l'image de s'étirer dans tous les états de contrôle. Cela a fonctionné pour moi, mais faites-moi savoir si ce n'est pas le cas!
REMARQUE: Ici, nous abordons un problème lié à
UIButton
, mais leinsideButton:
pourrait aussi bien êtreinsideView:
, ou à tout ce que l'on souhaite insérer dans l'image.la source
J'ai eu ce problème il y a quelque temps. Le problème que j'ai eu était que j'essayais d'appliquer cet effet à l'UIButton d'arrière-plan qui est limité et signifie donc que vous ne pouvez pas l'ajuster aussi facilement.
L'astuce est de la définir comme une image, puis d'appliquer la technique de @ ayreguitar et cela devrait résoudre le problème!
la source
Cela a fonctionné pour moi
Merci à @ayreguitar pour son commentaire
la source
Voici une réponse alternative rapide:
la source
En combinant plusieurs réponses différentes en une seule solution: créez un bouton avec un type personnalisé, définissez la propriété imageView contentMode du bouton et définissez l'image du bouton (pas l'image d'arrière-plan, qui sera toujours mise à l'échelle pour remplir).
la source
la source
Cette réponse est basée sur la réponse de @ WernerAltewischer .
Pour éviter d'avoir connecté mon bouton à un IBOutlet pour exécuter le code dessus, j'ai sous-classé la classe d'UIButton:
Créez maintenant un bouton personnalisé dans votre xib et définissez son image (pas l'image d'arrière-plan):
Ensuite, définissez sa classe:
Vous avez terminé!
Au lieu de
l'ajustement de l'aspect de l'image de votre bouton est maintenant comme prévu:
la source
ios 12. Vous devez également ajouter l'alignement du contenu
la source
J'ai eu des problèmes avec l'image qui ne se redimensionnait pas proportionnellement, donc la façon dont je l'ai corrigée utilisait des encarts de bord.
la source
Les modes de contenu UIView s'appliquent au "contenu" du CALayer correspondant. Cela fonctionne pour les
UIImageView
s car ils définissent leCALayer
contenu sur le fichierCGImage
.drawRect:
rend finalement au contenu de la couche.Une personnalisation
UIButton
(pour autant que je sache) n'a pas de contenu (les boutons de style rectangle arrondi peuvent être rendus à l'aide de contenu). Le bouton a des sous-vues: l'arrière-planUIImageView
, l'imageUIImageView
et le titreUILabel
. La définition decontentMode
sur les sous-vues peut faire ce que vous voulez, mais déranger laUIButton
hiérarchie des vues est un peu un non-non.la source
Changer
UIButton.imageView.contentMode
n'a pas fonctionné pour moi.J'ai résolu le problème en définissant l'image sur la propriété «Arrière-plan».
Vous pouvez ajouter une contrainte de rapport si vous avez besoin
la source
Cela recoupe de nombreuses autres réponses, mais la solution pour moi était de
contentMode
duUIImageView
pour le bouton.ScaleAspectFit
- qui soit peut être fait dans le dans Interface Builder « définie par l' utilisateur d' exécution Attributs » (ie.self.imageView.contentMode
, numéro 1) ou dans uneUIButton
sous - classe;la source
Vous pouvez utiliser imageWithCGImage comme indiqué ci-dessus (mais sans les parenthèses manquantes).
De plus ... des millions de téléphones non 4.0 ne fonctionneront pas du tout avec ce code.
la source
[button sizeToFit]
travaillé pour moi.la source
Similaire à @Guillaume, j'ai créé une sous-classe d'UIButton en tant que fichier Swift. Ensuite, définissez ma classe personnalisée dans Interface Builder:
.
Et voici le fichier Swift:
la source
J'ai eu le même problème, mais je n'ai pas pu le faire fonctionner (c'est peut-être un bogue avec le SDK).
Finalement, comme solution de contournement, j'ai placé un
UIImageView
derrière mon bouton et défini les options que je voulais, puis j'ai simplement placé un blancUIButton
dessus.la source