L'impostazione dell'immagine di UIButton si traduce in un pulsante blu in iOS 7


163

Su iOS 6 SDK ho scritto le seguenti righe di codice per visualizzare un'immagine all'interno di un pulsante:

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];

Ma ora con Xcode 5 e iOS 7 questo non funziona. Il pulsante non contiene l'immagine. Il pulsante è pieno di colore blu.


L'immagine appare quando si fa clic sul pulsante?
JustAnotherCoder

Risposte:


378

In iOS7 c'è un nuovo tipo di pulsante chiamato UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // pulsante di sistema standard

Controlla il tuo file .xib e cambia il tipo di pulsante in Personalizzato Guarda l'immagine

Per fare ciò a livello di codice, aggiungi questa riga a viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 

2
[UIButton buttonWithType: UIButtonTypeSystem];
spietato

57
Si noti che questa soluzione rimuove il colore della tinta del sistema, ma comporta anche una forte transizione tra gli stati evidenziato e normale. Se stai cercando di preservare il comportamento del sistema, le animazioni, ecc., Ma vuoi sbarazzarti del colore della tinta, prova [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(con il tipo di pulsante impostato su "Sistema" in IB).
JWK,

Grazie questo è stato molto utile. Nel nostro caso, il pulsante è stato persino ritagliato sulla forma del PNG trasparente e quindi colorato.
g_pass,

Accidenti hanno nascosto che uno bene non è vero ?!
Maury Markowitz,

funziona :) potresti avere qualche altro problema nel tuo codice ur. Se guardi Xcode 6.1 puoi vedere chiaramente le opzioni disponibili ..
Chamira Fernando

53

Sembra che iOS 7 stia usando l'immagine fornita proprio come una maschera Alpha per visualizzare il colore della tinta del pulsante. Cambiare il tipo di pulsante per UIButtonTypeCustomfare il trucco per me (grazie user716216!). L'impostazione dell'immagine come sfondo non funziona sempre se hai già un'immagine di sfondo, come nel mio caso.


Grazie! L'utente originale ha dimenticato di accettarlo come risposta.
Jigzat,

funziona per me, ma il passaggio al sistema non funziona per il mio caso, grazie per tutto il tuo contributo
chings228

29

Swift 3, 4, 5:

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

24

C'è una buona probabilità che l'immagine sia lì e non riesci proprio a vederla. Prova a cambiare il tipo di pulsante in UIButtonTypeCustom. Se il problema persiste, imposta il colore di sfondo del pulsante su[UIColor clearColor];


9

Il problema è TintColor. Per impostazione predefinita, iOS lancia un colore blu su ogni pulsante. Puoi aggirarlo in 3 modi.

  1. Cambia il colore della tinta. [button setTintColor:[UIColor blackColor]]; Questo può colorare la tua immagine come non vuoi.

  2. Come molti altri hanno suggerito, impostare l'immagine di sfondo. [button setBackgroundImage:[UIImage...]];

  3. Aggiungi un UIImageView al tuo pulsante.

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

[button addSubView:img];


9

Per rapido:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton

6

Ho avuto lo stesso problema. Sul mio storyboard avevo un pulsante senza alcuna immagine.

Vorrei quindi assegnare l'immagine nel codice.

È arrivato IOS 7 e ho ottenuto molte immagini blu.

La risoluzione era semplice ma confusa. Se assegno un'immagine sullo storyboard e poi cambio l'immagine in fase di esecuzione, funziona perfettamente.

Devi sempre specificare un'immagine iniziale sullo storyboard anche se non la utilizzerai.


3

Questo ha funzionato per me

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

Nota: rimuovere l'immagine anteriore prima di procedere.


come rimuovere l'immagine di sfondo per favore !!
simbesi.com

3

Vecchio thread, ma volevo entrare perché avevo appena avuto lo stesso problema. Il problema era che hai chiamato setImage quando dovresti chiamare setBackgroundImage.


1

Nessuna delle soluzioni fornite funzionava per me. Se non imposti un'immagine iniziale in Storyboard, puoi comunque modificare l'immagine del pulsante utilizzandosetBackgroundImage .

Per il tuo esempio, è necessaria solo una piccola modifica.

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];

1

Questo problema è chiamato problema di colore blu del pulsante in xcode. Quando creiamo un pulsante per codice, il pulsante mostra il colore della tinta blu per impostazione predefinita, che può essere risolto assegnando il colore della tinta al nero o al bianco in base al colore della tua cella. Il codice è:

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];

è abbastanza utile @Shane
Rudra,

1

Usando Xcode 9.2 nessuna delle soluzioni di cui sopra ha funzionato per quello che stavo cercando.

Stavo cercando una soluzione che mi permettesse di impostare .normale .selected UIControlStateimmagini all'interno dello storyboard per la loro modalità di rendering originale , ma, all'interno del file Swift, non dovrebbero esistere valori letterali di stringhe per quanto riguarda i nomi delle immagini.

Fondamentalmente, all'interno del tuo codice otterrai l'immagine che hai impostato .normalnello storyboard per lo stato e lo renderizzerai nuovamente come .alwaysOriginal(Lo stesso per lo .selectedstato), quindi imposterai quell'immagine (che ora è resa come originale e non sarà influenzata da la tinta) per lo stato ( .normale .selected) pertinente del tuoUIButton .

Ecco qui:

// 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)

In questo modo è possibile impostare gli stati dell'immagine del pulsante e se il nome dell'immagine cambierà, ciò non influirà sul codice.


1

In iOS 13: basta impostare la proprietà Tinta su Bianco, mantenendo il tipo di UIButton su Personalizzato


0

rendendo il colore della tinta come colore chiaro per tutti e quattro gli stati (Default, Evidenziato, Selezionato, Disabilitato) ha funzionato per me.


-1

In Swift 4 , inizializza i tuoi UIButtondati immagine come segue:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.