94 votes

UIButton n'écoute pas les paramètres du mode de contenu ?

FirstButton est un UIButton de type Custom. Par programmation, j'en place trois dans chaque cellule d'un tableau, de la manière suivante :

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

Ailleurs, je lui dis d'utiliser la fonction clipToBounds. Ce que j'obtiens est un découpage du carré central de l'image, plutôt qu'un rendu à l'échelle de l'image. J'ai essayé de nombreuses façons, y compris en définissant la propriété mode sur firstButton.imageView, ce qui ne semble pas fonctionner non plus.

1 votes

Voir la solution de Chris Nolet ci-dessous : button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop ;

0 votes

Voir stackoverflow.com/a/28205566/481207 qui montre que la définition de contentVerticalAlignment et contentHorizontalAlignment est nécessaire pour UIViewContentModeScaleAspectFit.

188voto

Dave Points 3228

J'ai eu le même problème. Je vois que cette question est un peu ancienne, mais je veux fournir une réponse claire et correcte pour faire gagner du temps à d'autres personnes (comme moi) lorsque cette question apparaîtra dans leurs résultats de recherche.

Il m'a fallu un peu de recherche et d'expérimentation, mais j'ai trouvé la solution. Il suffit de définir le ContentMode de l'ImageView "cachée" qui se trouve à l'intérieur du UIButton.

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

C'est peut-être ce à quoi Dan Ray faisait allusion dans sa réponse acceptée, mais je ne le pense pas.

1 votes

Non, ça ne l'était pas. La solution que j'ai retenue est d'utiliser un UIImageView pour contenir l'image, puis un UIButton clair et transparent de type "custom" par-dessus.

0 votes

Dave, sur iOS 3.2 au moins, votre solution ne semble pas fonctionner pour moi. Dommage, car j'espérais obtenir la mise en évidence de l'image au clic "gratuitement". Je me suis même assuré que button.imageView n'était pas nil à l'endroit où j'ai défini contentMode, et j'ai défini l'image après avoir défini contentMode, comme vous le faites.

2 votes

Pour clarifier, "ne fonctionne pas" signifie "l'image est affichée à sa pleine résolution, et non réduite comme je l'espérais".

77voto

Alfie Hanssen Points 3090

Si vous traitez l'image de l'UIButton (par opposition à son backgroundImage), le réglage du contentMode sur l'UIButton lui-même ou sur son imageView n'a aucun effet (malgré ce que disent les autres réponses).

Sinon, faites ceci à la place :

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Ou dimensionnez votre image en conséquence.

OU utilisez simplement un UIImageView (qui respecte correctement le contentMode) auquel est attaché un UITapGestureRecognizer, ou un UIButton transparent par-dessus.

4 votes

Cela fonctionne pour mon cas dans iOS 7 alors que tous les autres ici ne le font pas.

5 votes

La solution correcte consiste à définir contentHorizontalAlignment et contentVerticalAlignment. Voir stackoverflow.com/a/28205566/481207 pour une explication.

1 votes

C'est la réponse que je cherchais.

56voto

Chris Nolet Points 1628

Plutôt que de définir la contentMode sur le bouton lui-même, vous voudrez régler contentHorizontalAlignment y contentVerticalAlignment et (ce qui est crucial) les contentMode pour le bouton imageView pour tout type de remplissage ou d'ajustement de l'aspect :

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

Vous pouvez également faire d'autres choses, comme aligner l'image du bouton en haut. Si vous n'avez pas besoin d'un aspect fill ou fit, vous pouvez simplement définir l'alignement par lui-même :

button.contentVerticalAlignment = .top

2 votes

Merci Chris - cela a résolu mon problème, ou plutôt, cela l'a fait en combinaison avec contentEdgeInsets, afin de faire reculer un peu mon image du bord supérieur.

7voto

Pierre Points 367

Après quelques heures de confusion, voici comment j'ai réussi à le faire fonctionner sous iOS 3.2. Comme l'a mentionné dusker, l'utilisation de setBackgroundImage au lieu de setImage a fait l'affaire pour moi.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

6voto

Dan Ray Points 14852

La solution consiste à utiliser une UIImageView avec tous les paramètres de mode de contenu que vous souhaitez, puis à superposer un bouton personnalisé. C'est idiot de ne pas pouvoir faire tout cela en une seule fois, mais il semble que ce ne soit pas possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X