uiimage swift - L'impostazione dell'immagine UIButton produce un pulsante blu in iOS 7




developer view (12)

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 è riempito con il colore blu.


Answers

Vecchio thread, ma volevo sentirmi perché avevo solo lo stesso problema. Il problema era che si chiama setImage quando si dovrebbe chiamare setBackgroundImage.


Nessuna delle soluzioni fornite funzionava per me. Se non si imposta un'immagine iniziale in Storyboard, è comunque possibile modificare l'immagine del pulsante utilizzando setBackgroundImage .

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

Swift 3:

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

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

Per farlo a livello di viewDidLoad , aggiungi questa linea a viewDidLoad :

[UIButton buttonWithType:UIButtonTypeSystem]; 

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


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

Stavo cercando una soluzione che mi .selected UIControlState immagini .normal e .selected UIControlState all'interno dello storyboard per la loro modalità di rendering originale , ma, all'interno del file Swift, non dovrebbero esistere letterali di stringa relativi ai nomi delle immagini.

Fondamentalmente, all'interno del tuo codice otterrai l'immagine che hai impostato all'interno del tuo storyboard per .normal stato .normal e ri-renderlo come .alwaysOriginal (lo stesso per .selected stato selezionato), quindi, imposterai quell'immagine (che ora è resa come originale e non sarà influenzato dalla tinta) per lo stato pertinente ( .normal e .selected ) del tuo UIButton .

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 puoi impostare gli stati dell'immagine del pulsante e se il nome dell'immagine cambierà, ciò non influirà sul codice.


Per rapido:

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

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

Assegnerei quindi l'immagine nel codice.

IOS 7 è arrivato e ho ricevuto molte immagini blu.

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

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


il colore della tinta come clearcolor per tutti e quattro gli stati (Predefinito, Evidenziato, selezionato, disabilitato) ha funzionato per me.


Il problema è TintColor. Per impostazione predefinita, iOS genera 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 in modi che non vuoi.

  2. Come molti altri suggeriscono, imposta l'immagine di sfondo. [button setBackgroundImage:[UIImage...]];

  3. Aggiungi un UIImageView al tuo pulsante.

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

[button addSubView:img];


Questo problema è chiamato problema del colore blu del pulsante in xcode. Quando creiamo un pulsante per codice, il pulsante mostra il colore della tinta blu per impostazione predefinita. Ciò 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];

Imposta il contenutoHorizontalAlignment:

emailBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

Potresti anche voler regolare il contenuto a sinistra, altrimenti il ​​testo sfiorerà il bordo sinistro:

emailBtn.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);