La définition de l'image UIButton entraîne un bouton bleu dans iOS 7

163

Sur le SDK iOS 6, j'ai écrit les lignes de code suivantes pour afficher une image à l'intérieur d'un bouton:

NSURL *thumbURL2 = [NSURL URLWithString:@"http://example.com/thumbs/2.jpg"];
NSData *thumbData2 = [NSData dataWithContentsOfURL:thumbURL2];
UIImage *thumb2 = [UIImage imageWithData:thumbData2];
[btn2 setImage:thumb2 forState:UIControlStateNormal];
[self.view addSubview:btn2];

Mais maintenant, avec Xcode 5 et iOS 7, cela ne fonctionne pas. Le bouton ne contient pas l'image. Le bouton est rempli de couleur bleue.

user2665539
la source
L'image apparaît-elle lorsque vous cliquez sur le bouton?
JustAnotherCoder

Réponses:

378

Dans iOS7, il existe un nouveau type de bouton appelé UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // bouton système standard

Vérifiez votre fichier .xib et changez le type de bouton en Personnalisé Regardez l'image

Pour ce faire par programme, ajoutez cette ligne au viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 
Chamira Fernando
la source
2
[UIButton buttonWithType: UIButtonTypeSystem];
avuthless
57
Notez que cette solution supprime la couleur de la teinte du système, mais entraîne également une transition dure entre les états en surbrillance et normal. Si vous cherchez à conserver le comportement du système, les animations, etc., mais que vous voulez vous débarrasser de la couleur de teinte, essayez [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(avec le type de bouton réglé sur "Système" dans IB).
JWK
Merci, ceci était vraiment utile. Dans notre cas, le bouton était même découpé à la forme du PNG transparent, puis teinté.
g_pass
Bon sang, ils ont bien caché celui-là, n'est-ce pas?!
Maury Markowitz le
ça marche :) Vous pourriez avoir un autre problème dans votre code. Si vous regardez Xcode 6.1, vous pouvez clairement voir les options disponibles ..
Chamira Fernando
53

Il semble que iOS 7 utilise l'image fournie comme un masque Alpha pour afficher la couleur de teinte du bouton. Changer le type de bouton a UIButtonTypeCustomfait l'affaire pour moi (merci user716216!). Définir l'image comme arrière-plan ne fonctionne pas toujours si vous avez déjà une image d'arrière-plan, comme ce fut mon cas.

utilisateur3099609
la source
Je vous remercie! L'utilisateur d'origine a oublié de l'accepter comme réponse.
jigzat
cela fonctionne pour moi, mais le changement de système ne fonctionne pas pour mon cas, merci à toute votre contribution
chings228
29

Swift 3, 4, 5:

let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)
Wilson
la source
24

Il y a de fortes chances que l'image soit là et que vous ne puissiez tout simplement pas la voir. Essayez de changer le type du bouton en UIButtonTypeCustom. Si cela ne fonctionne pas, définissez la couleur d'arrière-plan du bouton sur[UIColor clearColor];

Mick MacCallum
la source
9

Le problème est le TintColor. Par défaut, iOS jette une teinte bleue sur chaque bouton. Vous pouvez le contourner de 3 façons.

  1. Changez la couleur de la teinte. [button setTintColor:[UIColor blackColor]]; Cela peut colorer votre image d'une manière dont vous ne le souhaitez pas.

  2. Comme la plupart des autres l'ont suggéré, définissez l'image d'arrière-plan. [button setBackgroundImage:[UIImage...]];

  3. Ajoutez un UIImageView à votre bouton.

UIImageView * img = [[UIImageView alloc] initWithImage:[UIImage...]];

[button addSubView:img];

DrDisc
la source
9

Pour rapide:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
Esqarrouth
la source
6

J'ai eu le même problème. Sur mon storyboard, j'avais un bouton sans aucune image.

J'attribuerais alors l'image dans le code.

IOS 7 est arrivé et j'ai eu beaucoup d'images bleues.

La résolution était simple mais déroutante. Si j'attribue une image sur le storyboard, puis que je change l'image au moment de l'exécution, cela fonctionne bien.

Vous devez toujours spécifier une image de départ sur le storyboard même si vous n'allez pas l'utiliser.

Ryan Heitner
la source
3

Cela a fonctionné pour moi

[myButton1 setBackgroundImage:[UIImage imageNamed:@"phones.png"] forState:UIControlStateNormal];

Remarque: retirez l'image de devant avant de faire cela.

datha
la source
comment supprimer l'image de fond s'il vous plaît !!
simbesi.com
3

Vieux fil, mais je voulais intervenir parce que j'avais juste le même problème. Le problème était simplement que vous appelez setImage lorsque vous devez appeler setBackgroundImage.

Rob Schlackman
la source
1

Aucune des solutions proposées ne fonctionnait pour moi. Si vous ne définissez pas d'image initiale dans Storyboard, vous pouvez toujours modifier l'image du bouton à l'aide de setBackgroundImage.

Pour votre exemple, seul un changement mineur est nécessaire.

NSURL *thumbURL2 = [NSURL URLWithString:@"http://example.com/thumbs/2.jpg"];
NSData *thumbData2 = [NSData dataWithContentsOfURL:thumbURL2];
UIImage *thumb2 = [UIImage imageWithData:thumbData2];
[btn2 setBackgroundImage:thumb2 forState:UIControlStateNormal];
[self.view addSubview:btn2];
Alex
la source
1

Ce problème est appelé problème de couleur bleue du bouton dans xcode. Lorsque nous créons bouton par code, le bouton affiche la couleur de teinte bleue par défaut, ce qui peut être résolu en attribuant une couleur de teinte au noir ou au blanc en fonction de la couleur de votre cellule. Le code est:

UIImage *closebtnimg = [UIImage imageNamed:@"icon_uncheck.png"];
 UIImage *closebtnimg1 = [UIImage imageNamed:@"icon_checked.png"];

Custombutton *button = [Custombutton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(52, 66, 25, 24)];
[button setBackgroundImage:closebtnimg forState:UIControlStateNormal];
[button setBackgroundImage:closebtnimg1 forState:UIControlStateSelected];
[button setTintColor:[UIColor whiteColor]];
[cell.contentView addSubview:button];
[button addTarget:self action:@selector(changeImage:)  forControlEvents:UIControlEventTouchUpInside];
Shane
la source
c'est assez utile @Shane
Rudra
1

En utilisant Xcode 9.2, aucune des solutions ci-dessus n'a fonctionné pour ce que je recherchais.

Je cherchais une solution qui me permettrait de définir .normalet des .selected UIControlStateimages à l'intérieur du storyboard pour leur mode de rendu d'origine , mais, à l'intérieur du fichier Swift, aucune chaîne littérale ne devrait exister concernant les noms d'image.

Fondamentalement, à l'intérieur de votre code, vous obtiendrez l'image que vous avez définie dans votre storyboard pour l' .normalétat et la restituerez comme .alwaysOriginal(Identique pour l' .selectedétat), puis vous définirez cette image (qui est maintenant rendue comme originale et ne sera pas affectée par la teinte) pour l'état concerné ( .normalet .selected) de votre UIButton.

C'est ici:

// Get your .normal image (you set via your storyboard) and render it as original
let unselectedImage = yourButton.image(for: .normal)?.withRenderingMode(.alwaysOriginal)
// Set your normal image but this time rendered as original
yourButton.setImage(unselectedImage, for: .normal)
// Same for selected state
let selectedImage = yourButton.image(for: .selected)?.withRenderingMode(.alwaysOriginal)
yourButton.setImage(selectedImage, for: .selected)

De cette façon, vous pouvez définir les états de l'image de votre bouton et si le nom de l'image change, cela n'affectera pas votre code.

OhadM
la source
1

Dans iOS 13 - définissez simplement la propriété Tint sur Blanc, tout en conservant le type de UIButton comme Personnalisé

rommex
la source
0

rendre la couleur de la teinte comme une couleur claire pour les quatre états (par défaut, surligné, sélectionné, désactivé) a fonctionné pour moi.

Rajashekar
la source
-1

Dans Swift 4 , initialisez UIButtonet attribuez vos données d'image comme suit:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Frank Eno
la source